concinno-skills-knowledge
Knowledge-base agent skills for Concinno. Native Python API, no MCP required. MIT / Apache-2.0 / BSD licensed SDKs only — we deliberately keep the Concinno ecosystem permissive-licence-clean.
Status
MVP (0.1.0) — five one-shot tools covering Notion, Confluence, and local Obsidian vaults:
| Tool class | Platform | Underlying SDK | SDK licence |
|---|---|---|---|
NotionPage |
Notion | notion-client |
MIT |
NotionDatabase |
Notion (DB) | notion-client |
MIT |
ConfluencePage |
Atlassian Cloud | atlassian-python-api |
Apache-2.0 |
ObsidianVault |
Obsidian (local) | stdlib + python-frontmatter |
MIT |
ObsidianDailyNote |
Obsidian (local) | stdlib + python-frontmatter |
MIT |
Dendron, Logseq, and Evernote are intentionally deferred until a maintained Python SDK with a permissive licence exists. Atlassian Server / Data Center is out of scope (Atlassian stopped selling it in 2024).
Install
pip install concinno-skills-knowledge
All three SDK dependencies are hard requirements and pulled in
automatically. python-frontmatter is used by the Obsidian tools only;
it is <50kB so we do not gate it behind an optional extra.
Credentials
All credentials live under well-known keys in the Concinno
CredentialStore, which reads (in order):
- Process runtime overrides via
CredentialStore.set(...). - Env var
CONCINNO_CRED_<UPPER_KEY>. ~/.concinno/credentials.json.
| Key | Env var |
|---|---|
notion_token |
CONCINNO_CRED_NOTION_TOKEN |
confluence_url |
CONCINNO_CRED_CONFLUENCE_URL |
confluence_email |
CONCINNO_CRED_CONFLUENCE_EMAIL |
confluence_api_token |
CONCINNO_CRED_CONFLUENCE_API_TOKEN |
obsidian_vault_path |
CONCINNO_CRED_OBSIDIAN_VAULT_PATH |
Example ~/.concinno/credentials.json:
{
"notion_token": "ntn_...",
"confluence_url": "https://mycompany.atlassian.net",
"confluence_email": "me@mycompany.com",
"confluence_api_token": "atl-...",
"obsidian_vault_path": "C:\\Users\\me\\Vault"
}
Obsidian has no server, but the vault root path lives in the same
credential store for UX consistency — users configure everything in one
place. Notion expects an integration token from
https://www.notion.so/profile/integrations; Confluence expects an
Atlassian API token from
https://id.atlassian.com/manage-profile/security/api-tokens.
If any required credential is missing the tool returns
{"error": "no <service> credentials — set via CredentialStore or env ..."}
rather than crashing.
Usage via Concinno ToolRegistry
When the consumer sets CONCINNO_LOAD_PLUGINS=1, the default registry
auto-mounts every knowledge tool:
import os
os.environ["CONCINNO_LOAD_PLUGINS"] = "1"
from concinno.tools.registry import get_default_registry
reg = get_default_registry()
expected = {
"NotionPage",
"NotionDatabase",
"ConfluencePage",
"ObsidianVault",
"ObsidianDailyNote",
}
assert expected <= set(reg.list_deferred())
page = reg.get("NotionPage")
page.call(action="search", query="agent", limit=20)
Direct Python usage
from concinno_skills_knowledge import (
NotionPage,
NotionDatabase,
ConfluencePage,
ObsidianVault,
ObsidianDailyNote,
)
# Notion
NotionPage().call(action="search", query="roadmap", limit=10)
NotionPage().call(action="get", page_id="...")
NotionDatabase().call(
action="query",
database_id="...",
filter={"property": "Status", "status": {"equals": "Done"}},
)
# Confluence
ConfluencePage().call(action="search", query="platform", limit=30)
ConfluencePage().call(
action="create",
space="DOCS",
title="Agent design",
body="<p>draft</p>",
)
# Obsidian (local)
ObsidianVault().call(action="search", query="reranker")
ObsidianVault().call(
action="write",
path="notes/today.md",
content="hello",
frontmatter={"tags": ["agent"]},
)
ObsidianDailyNote().call(action="append", text="- shipped 0.1.0")
ObsidianDailyNote().call(action="read") # today's note
All tools return {"ok": True, ...} on success or {"error": "..."}
on failure — same shape as the other Concinno built-in tools. No
exceptions escape the call() surface.
Safety
ObsidianVault and ObsidianDailyNote resolve every path argument
through Path.is_relative_to(vault_root) after a canonical resolve, so
../ traversal or absolute paths escape the vault are rejected with
{"error": "path escapes vault subtree: ..."}. Absolute paths are also
rejected up-front.
NotionPage.search and NotionDatabase.query cap limit at 100 (the
Notion API's own maximum); ConfluencePage.search caps at 100 as well.
ObsidianVault.search defaults to 50 hits with a 500 hard cap and
returns "truncated": true when the limit is reached.
Concurrency
All five tools set is_concurrency_safe = False. KB platforms either
have strict rate limits (Notion 3 req/s, Confluence tighter) or open a
session-per-call (Obsidian writes); the Concinno scheduler will honour
this automatically.
License
Apache-2.0.
Metadata
Release files for concinno-skills-knowledge 0.1.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_knowledge-0.1.0.tar.gz | 47.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| concinno_skills_knowledge-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 65.4 kB
Release files / concinno_skills_knowledge-0.1.0.tar.gz
| Download URL | concinno_skills_knowledge-0.1.0.tar.gz |
|---|---|
| Size | 47.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3c188c764c8bc13faff0dc4f46c1dffe63ed233697d6b9cab95407b4f6f97eaa
|
|
BLAKE2b-256 checksum How to use checksums |
2872f5d223c6f37fe949985d1716f6cfc331868acfb5150e8cecfc4f9ff675b7
|
| 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_knowledge-0.1.0-py3-none-any.whl
| Download URL | concinno_skills_knowledge-0.1.0-py3-none-any.whl |
|---|---|
| Size | 18.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5fad7e13ff082e899117648967eb19c037cbfea0ec4c1636e1f74ff48d82f56b
|
|
BLAKE2b-256 checksum How to use checksums |
cb92a34649718625118301ea3692257a1dbb58c8db70d8e4439ba81deb61a479
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.9
|