concinno-skills-google
Google ecosystem agent skills for Concinno. Native Python API first, MCP fallback optional.
Status
MVP (0.1.0) — GoogleCalendar only. Drive / Gmail / YouTube Data will
follow in subsequent minor releases under the same entry-point group so
no Concinno upgrade is required when new tools land.
Install
pip install concinno-skills-google
google-api-python-client and google-auth are hard dependencies
(the tool is useless without them) and will be pulled in automatically.
OAuth setup
This package does not run an interactive OAuth flow — tokens are a one-shot user responsibility. Use any of the standard Google quickstart flows to produce an authorized-user token JSON, then make it visible to Concinno via either of:
Option A — drop the file (simplest):
mkdir -p ~/.concinno
cp path/to/your/token.json ~/.concinno/google_token.json
Option B — Concinno CredentialStore (preferred when you already
use it for other secrets):
from concinno.core.credentials import get_default_store
store = get_default_store()
store.set("google_oauth_token", open("token.json").read())
Or persist it via the config file:
// ~/.concinno/credentials.json
{
"google_oauth_token": "{...authorized-user token JSON as a string...}"
}
Expired access tokens are refreshed automatically; the refreshed JSON is written back to whichever source provided it.
Usage via Concinno ToolRegistry
When the consumer sets CONCINNO_LOAD_PLUGINS=1, the default registry
auto-mounts GoogleCalendar:
import os
os.environ["CONCINNO_LOAD_PLUGINS"] = "1"
from concinno.tools.registry import get_default_registry
reg = get_default_registry()
assert "GoogleCalendar" in reg.list_deferred()
tool = reg.get("GoogleCalendar")
events = tool.call(
action="list",
time_min="2026-04-22T00:00:00Z",
time_max="2026-04-23T00:00:00Z",
max_results=50,
)
Direct Python usage
No registry round-trip required; instantiate directly:
from concinno_skills_google import GoogleCalendar
cal = GoogleCalendar()
# List
events = cal.call(
action="list",
calendar_id="primary",
time_min="2026-04-22T00:00:00Z",
)
# Create
created = cal.call(
action="create",
event={
"summary": "Deep work block",
"start": {"dateTime": "2026-04-22T14:00:00+08:00"},
"end": {"dateTime": "2026-04-22T16:00:00+08:00"},
},
)
# Delete
cal.call(action="delete", event_id=created["id"])
All methods return either a plain list[dict] (for list) or a small
status dict. On failure they return {"error": "..."} rather than
raising — same shape as the other Concinno built-in tools.
License
Apache-2.0. See LICENSE in the Concinno monorepo.
Metadata
Release files for concinno-skills-google 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| concinno_skills_google-0.2.0.tar.gz | 49.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| concinno_skills_google-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 70.2 kB
Release files / concinno_skills_google-0.2.0.tar.gz
| Download URL | concinno_skills_google-0.2.0.tar.gz |
|---|---|
| Size | 49.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6c5144174b3edf0bee45db6cbec35ecb36d172b9e47c5d5689143e37fa042cc7
|
|
BLAKE2b-256 checksum How to use checksums |
0ca4bad97c0d6d5270e6c2b61e5f4ac1369c0f718aa18c4ec50a1aae10f7f1d9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.9
|
Release files / concinno_skills_google-0.2.0-py3-none-any.whl
| Download URL | concinno_skills_google-0.2.0-py3-none-any.whl |
|---|---|
| Size | 21.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
49b9258772ab13025a743e3b3632698d2400f497094dc89c2dd0fbf902191363
|
|
BLAKE2b-256 checksum How to use checksums |
687a370f2f3306eb711686e35d4c8b9ebcce3db4c285c54803312be24d7317eb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.9
|