Knowledge-base agent skills (Notion/Confluence/Obsidian) for Concinno — native Python API. MIT / Apache-2.0 / BSD SDKs only.
Project description
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file concinno_skills_knowledge-0.1.0.tar.gz.
File metadata
- Download URL: concinno_skills_knowledge-0.1.0.tar.gz
- Upload date:
- Size: 47.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3c188c764c8bc13faff0dc4f46c1dffe63ed233697d6b9cab95407b4f6f97eaa
|
|
| MD5 |
631d051843a819360dc056c840e0ccb3
|
|
| BLAKE2b-256 |
2872f5d223c6f37fe949985d1716f6cfc331868acfb5150e8cecfc4f9ff675b7
|
File details
Details for the file concinno_skills_knowledge-0.1.0-py3-none-any.whl.
File metadata
- Download URL: concinno_skills_knowledge-0.1.0-py3-none-any.whl
- Upload date:
- Size: 18.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5fad7e13ff082e899117648967eb19c037cbfea0ec4c1636e1f74ff48d82f56b
|
|
| MD5 |
c69ba6e6b7c6d046ee7bad377f9b3e48
|
|
| BLAKE2b-256 |
cb92a34649718625118301ea3692257a1dbb58c8db70d8e4439ba81deb61a479
|