io.github.Beever-AI/beever-atlas
OCI · GHCR.IO/BEEVER-AI/BEEVER-ATLAS:0.3.0
Open-source LLM knowledge base: team chat into a typed knowledge graph and auto-generated wiki.
Available components
Last scanned (19 hours ago)
Scores higher than 99% of OCI servers
Category Memory and Knowledge
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security0
- No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.Unverified
- Known CVEs could not be checked: this image's dependency list comes from an SBOM its publisher attached, which nothing verifies, so we will not report it as a clean result. View diagnostics → Unverified
- Install-script risk not yet assessed.Unverified
- Dependency health could not be checked: this image's dependency list comes from an SBOM its publisher attached. It names packages and versions but not whether each is deprecated, still maintained or linked to its source, so there is nothing we can fairly grade.Unverified
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to Beever-AI/beever-atlas). View diagnostics → Pass
- Clear OSI-approved license (Apache-2.0).Pass
- Actively maintained (last published 142 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability76
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 11399 tokens (~407/item across 28 items; 28 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage99
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 97% of tool parameters carry a description.Partial
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 28 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 29 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Unverified: 1 category
A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 1 Nov 26 +1
- Stability: 0.97 → pass security
- 31 Oct 26 −1
- Stability: pass → 0.97 functional
- 25 Oct 26 +1
- Stability: 0.97 → pass security
- 23 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.
- 21 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.
- 19 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.
- 17 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 70 to 73. That category is still filling its 30-day observation window: 21 days of observed history at the previous scan, 22 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 4 Nov 2026 · Analysed oci/ghcr.io/beever-ai/beever-atlas:0.3.0
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | oci |
| Reason | Verified |
| Discovered via | OCI referrers API |
| Source repo | Beever-AI/beever-atlas |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/Beever-AI/beever-atlas/.github/workflows/release.yml@refs/heads/main |
| Rekor log index | 1822367589 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha256:b623e7d16f00bead3e2dc1c6841ad55689466598c6ec9e0b86e1c41dcefcdd72 |
Background: How many MCP packages publish verified provenance →
Vulnerabilities 248 ungraded findings
From the publisher's SBOM, not graded. These advisories match packages listed in the SBOM the publisher attached to this image. A publisher naming a vulnerable package in their own image is credible, so we show them. Nothing verifies that SBOM, though, so the Known CVEs signal does not grade the image from it.
| ID | CVE | Severity | Vector | Fix available |
|---|---|---|---|---|
| GHSA-2fqr-mr3j-6wp8 | CVE-2026-54279 | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
| GHSA-2g87-pp6c-29x5 | high | yes | ||
| GHSA-494j-54xm-rwp3 | CVE-2026-111063 | medium | yes | |
| GHSA-4fvr-rgm6-gqmc | CVE-2026-54273 | medium | yes | |
| GHSA-4m7w-qmgq-4wj5 | CVE-2026-54275 | low | yes | |
| GHSA-5wr8-gcqf-gqf3 | CVE-2026-111064 | high | yes | |
| GHSA-63hw-fmq6-xxg2 | CVE-2026-54277 | medium | yes | |
| GHSA-6cjc-53gc-5rqm | CVE-2026-111065 | medium | yes | |
| GHSA-9x8q-7h8h-wcw9 | CVE-2026-54280 | low | yes | |
| GHSA-9xw5-w5jj-pvcg | CVE-2026-111066 | high | yes | |
| GHSA-cq5v-8q36-5273 | CVE-2026-69244 | high | yes | |
| GHSA-f9xw-jh8m-3mwq | CVE-2026-111748 | medium | yes | |
| GHSA-g3cq-j2xw-wf74 | CVE-2026-54278 | medium | yes | |
| GHSA-gx76-c99x-2c96 | CVE-2026-111749 | low | yes | |
| GHSA-hpj7-wq8m-9hgp | CVE-2026-54276 | medium | yes | |
| GHSA-mfx4-hv73-q22v | CVE-2026-69243 | medium | yes | |
| GHSA-mq44-7p77-q5h7 | CVE-2026-59881 | medium | yes | |
| GHSA-pqxq-w44r-73xw | CVE-2026-111750 | medium | yes | |
| GHSA-xcgm-r5h9-7989 | CVE-2026-54274 | medium | yes | |
| PYSEC-2026-2107 | CVE-2026-54273 | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
| PYSEC-2026-2108 | CVE-2026-54274 | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
| PYSEC-2026-2109 | CVE-2026-54276 | medium | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N | yes |
| PYSEC-2026-2110 | CVE-2026-54277 | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
| PYSEC-2026-2111 | CVE-2026-54278 | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
| PYSEC-2026-2112 | CVE-2026-54279 | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
| PYSEC-2026-2113 | CVE-2026-54280 | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
| PYSEC-2026-237 | CVE-2026-54275 | high | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H | yes |
| PYSEC-2026-3545 | CVE-2026-69244 | none | yes | |
| PYSEC-2026-3546 | CVE-2026-69243 | none | yes | |
| PYSEC-2026-3547 | CVE-2026-59881 | none | yes | |
| GHSA-5p39-cfhj-2xmp | CVE-2026-64847 | medium | yes | |
| GHSA-82r6-8w77-94w6 | CVE-2026-63374 | critical | yes | |
| PYSEC-2026-4024 | CVE-2026-64847 | none | yes | |
| PYSEC-2026-4025 | CVE-2026-63374 | none | yes | |
| GHSA-9cfw-f3f9-7mm7 | CVE-2026-31072 | critical | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H | no |
| PYSEC-2026-282 | CVE-2026-31072 | critical | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H | no |
| GHSA-6v38-4h7w-rj9h | CVE-2026-96760 | critical | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N | yes |
| GHSA-7vr2-2fgp-9w7p | CVE-2026-114615 | high | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N | yes |
| GHSA-8m4g-j4wp-wgcg | CVE-2026-114616 | high | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N | yes |
| GHSA-c5mf-xmp2-59rc | CVE-2026-114617 | medium | CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N | yes |
| GHSA-c73q-w75p-j82v | CVE-2026-116672 | high | CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H | yes |
| GHSA-fch4-3c6x-j4gc | CVE-2026-114618 | medium | CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N | yes |
| GHSA-jj7h-c3hg-m23x | CVE-2026-114614 | low | CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:L/I:N/A:N | yes |
| GHSA-q686-2qmg-hqc7 | CVE-2026-114619 | medium | CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:L/I:L/A:N | yes |
| GHSA-x4rv-c3wx-4cr8 | CVE-2026-114620 | medium | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:L/I:L/A:N | yes |
| PYSEC-2026-4354 | CVE-2026-114614 | low | CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:L/I:N/A:N | yes |
| PYSEC-2026-4355 | CVE-2026-114615 | critical | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N | yes |
| PYSEC-2026-4356 | CVE-2026-114616 | critical | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N | yes |
| PYSEC-2026-4357 | CVE-2026-114617 | medium | CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N | yes |
| PYSEC-2026-4358 | CVE-2026-114618 | medium | CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:N | yes |
Showing 50 of 248 vulnerabilities.
Background: What a vulnerability scan can and cannot prove →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
ask_channel ~503
Answer a natural-language QUESTION about one channel with synthesized, cited reasoning. The flagship retrieval tool — call it when the user asks anything that needs an ANSWER rather than raw rows. When to use: any question about a channel's content where you want a composed answer with citations and reasoning across multiple messages ("what did we decide about X", "why did the project slip"). When NOT to use: exact keyword/semantic lookup of individual facts (use search_channel_facts); cross-channel recall when you don't know which channel holds the answer (use search_memory); a deterministic substring scan (use find_facts). Those are faster and return raw rows, not prose. Prerequisites: a channel_id from list_channels. Returns (instant for 'quick', long-running up to a 90s hard cap for 'deep'/'summarize'): a dict ``{answer: str, citations: [{fact_id, text, permalink, author, ts}], follow_ups: [str], metadata: {mode, ...}}``. Read-only — no side effects, triggers no jobs. Error modes (all returned as ``{error: ...}`` dicts, never exceptions): 'authentication_missing' (no principal); 'invalid_parameter' (empty/over- 4000-char question, or mode not in quick/deep/summarize); 'channel_access_denied' (token lacks access to channel_id); 'answer_timeout' (exceeded the 90s cap — retry with mode='quick'); 'adk_error' (internal pipeline failure).
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Channel id to query. Get it from list_channels (e.g. 'ch-eng'). Required. |
| mode | string | – | Retrieval depth. One of: 'quick' (BM25 only, no reasoning, ~3s), 'deep' (full pipeline with graph + multi-hop reasoning, ~20-60s), 'summarize' (structured summary, ~10-30s). Default 'deep'. |
| question | string | yes | Natural-language question, 1-4000 chars (e.g. 'What database did we pick and why?'). Longer questions return error 'invalid_parameter'. Required. |
| session_id | – | – | Optional session id for multi-turn continuity (e.g. 'sess-abc123' from start_new_session). Omit for a per-principal default session. Default null. |
Structured output declared, but exposes no named fields.
No examples provided.
find_decisions ~448
List the DECISIONS recorded in one channel, each with its rationale and rejected alternatives. Call it to answer "what did the team decide and why" when you want the structured decision record, not free-text facts. Returns a bare LIST and collapses missing-auth, access-denied, and internal errors into an EMPTY LIST — so ``[]`` means either no decisions OR no access; it never returns a structured error object and never raises. Disambiguation among the decision tools: use find_decisions for the current decision RECORDS in one channel (with rationale + alternatives_rejected). Use trace_decision_history to follow how one decision SUPERSEDED earlier ones over time (a graph timeline). Prefer find_decisions over find_facts(fact_type='decision') because only this tool enriches each result with rationale and alternatives. Prerequisites: a channel_id from list_channels. Returns (instant, read-only): a LIST (not a dict) of decisions sorted by ``decided_at`` descending, each ``{fact_id, decision (first sentence), decided_by, decided_at (YYYY-MM-DD), rationale (null if not yet extracted), alternatives_rejected, page_slug (empty if no host page yet)}``. No side effects. Error handling: on missing auth, access denial, or internal error this tool returns an EMPTY LIST ``[]`` rather than an error object (it never raises). An empty list therefore means either no decisions or no access — confirm access with list_channels if unexpected.
| Name | Type | Req | Description |
|---|---|---|---|
| author | – | – | Optional exact-match author name (e.g. 'Alice Chen'). Omit for any author. Default null. |
| channel_id | string | yes | Channel id. Get it from list_channels (e.g. 'ch-eng'). Required. |
| limit | integer | – | Max decisions to return, 1-100 (out-of-range values are clamped). Default 50. |
| since | – | – | Optional ISO-8601 date prefix (e.g. '2026-04-01'); keeps only decisions on or after this date. Omit for all dates. Default null. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
find_experts ~443
Rank the PEOPLE most knowledgeable about a topic in one channel. Call this to answer "who should I ask about X in #channel?" or to route a question to the right person. This is the only tool that ranks PEOPLE; use ``search_channel_facts`` / ``find_facts`` to find FACTS, and ``find_experts`` only when you specifically need a human. Prerequisite: a ``channel_id`` from ``list_channels``. Do NOT call with a channel display name. Returns (instant, read-only, no side effects): ``{"experts": [...]}`` — a list ranked by ``expertise_score`` descending. Each entry has ``handle`` (e.g. '@dana'), ``expertise_score`` (relative float, higher = more authoritative; not a fixed 0–1 scale, only meaningful for ranking within this result), ``fact_count`` (number of contributing facts), and ``top_topics`` (list of related topics that person engages with). An empty list means no graph signal for that topic — not an error. Error modes: ``{"error": "authentication_missing"}`` if the caller is unauthenticated; ``{"error": "channel_access_denied", "channel_id": ...}`` if the principal cannot read the channel; ``{"error": "invalid_parameter", ...}`` for a malformed ``channel_id``. Other backend failures degrade gracefully to ``{"experts": []}``.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Required. The channel id to search within, obtained from list_channels (e.g. 'ch-eng'). Not a human channel name. |
| limit | integer | – | Maximum number of experts to return. Range 1–20, default 5. Values outside the range are silently clamped (e.g. 50 -> 20, 0 -> 1). |
| topic | string | yes | Required. Topic or keyword to rank experts on, e.g. 'kubernetes', 'billing', 'auth'. Matched against knowledge-graph edges, so use a concept the channel actually discusses. |
Structured output declared, but exposes no named fields.
No examples provided.
find_facts ~500
Find facts in one channel whose text literally CONTAINS a substring (deterministic, case-insensitive). Call it when you know an exact keyword and want every matching raw fact row, not a ranked or synthesized result. Returns a bare LIST and collapses missing-auth, access-denied, empty-query, and internal errors into an EMPTY LIST — so ``[]`` means no match OR no access; it never returns a structured error object. Disambiguation: find_facts is a deterministic substring filter (predictable, no relevance ranking). For meaning-based / fuzzy retrieval use search_channel_facts (BM25+vector). For a synthesized answer use ask_channel. For decisions with rationale use find_decisions. When to use: exact-keyword scans ("every fact mentioning 'rollback'"), optionally narrowed by fact_type. When NOT to use: you want semantically related results for a phrase (use search_channel_facts). Prerequisites: a channel_id from list_channels. Returns (instant, read-only): a LIST (not a dict) of up to ``limit`` facts, sorted by importance DESC then recency (message_ts) DESC. The importance values that drive the sort rank, highest first, are 'critical' > 'high' > 'medium' > 'low' (any other/empty value sorts lowest). Each item is ``{fact_id, memory_text, fact_type, importance, author_name, message_ts, page_slug (empty if not yet on a page)}``. No side effects. Error handling: on missing auth, access denial, empty query, or internal error this tool returns an EMPTY LIST ``[]`` (it never raises) — an empty list means no match OR no access; confirm with list_channels if unexpected.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Channel id. Get it from list_channels (e.g. 'ch-eng'). Required. |
| fact_type | – | – | Optional type filter. One of: 'decision', 'observation', 'opinion', 'question', 'action_item'. Omit for all types. Default null. |
| limit | integer | – | Max facts to return, 1-100 (out-of-range values are clamped). Default 20. |
| query | string | yes | Case-insensitive substring matched literally inside each fact's text (e.g. 'rollback'). NOT semantic — exact substring only. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
get_extraction_status ~297
Report how far fact EXTRACTION has progressed for a channel's messages, as a count per status. Call it to judge whether a channel's knowledge is fully ingested before you trust retrieval results, or to track progress after triggering a sync. Distinguish from get_job_status: this counts MESSAGES by extraction state (corpus readiness); get_job_status reports the lifecycle of one async JOB by job_id. Use this for "is this channel done extracting?"; use get_job_status for "did my trigger_sync/refresh_wiki job finish?". When to use: gauge corpus completeness, or detect a backlog (high ``pending``) or failures (non-zero ``failed``) before relying on ask_channel/search_channel_facts. Prerequisites: a channel_id from list_channels. Returns (instant, read-only): ``{channel_id, counts: {pending, extracting, done, failed}, total}`` where each count is the number of messages in that state and ``total`` is their sum. No side effects. Error modes (returned as dicts): 'authentication_missing' (no principal); 'channel_access_denied' (token lacks access to channel_id); 'extraction_status_failed' (internal error reading the queue).
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Channel id whose extraction progress to report. Get it from list_channels (e.g. 'ch-eng'). Required. |
Structured output declared, but exposes no named fields.
No examples provided.
get_job_status ~396
Check the progress and result of a background job started by trigger_sync or refresh_wiki. Call this AFTER one of those tools returns a job_id, to learn whether the sync/wiki-generation has finished. This is read-only and instant; it neither starts work nor answers channel questions (use the retrieval tools for that). WHEN TO USE: poll after trigger_sync/refresh_wiki to wait for completion before reading the freshly ingested/regenerated data. POLLING CADENCE: wait ~2–3s between polls and back off on repeats; do NOT hot-loop. Sync/wiki jobs typically take seconds to a few minutes — stop once status is a terminal value (done / error / cancelled). PREREQUISITES: a job_id previously returned by trigger_sync or refresh_wiki; the job must belong to the calling principal. LATENCY & SIDE EFFECTS: instant, no side effects. RETURNS a dict: {job_id, kind ('sync' | 'wiki'), status, progress, started_at, updated_at, ended_at, result, error, target}. status: 'queued' | 'running' | 'done' | 'error' | 'cancelled'. progress: float 0.0–1.0, or null when not yet available. result/error are populated only once the job reaches a terminal state. ERROR MODES (returned as {error: ...}): 'authentication_missing'; 'invalid_parameter' (malformed job_id); 'job_not_found' — returned both for ids that do not exist AND for jobs owned by another principal, so no cross-principal job information is disclosed. Reading the atlas://job/<job_id> resource is an equivalent alternative for clients that prefer resources/read over tool calls.
| Name | Type | Req | Description |
|---|---|---|---|
| job_id | string | yes | Job to inspect, e.g. 'job_abc123'. This is the job_id returned by trigger_sync or refresh_wiki. Required. |
Structured output declared, but exposes no named fields.
No examples provided.
get_recent_activity ~314
List the most RECENT facts from one channel, newest first, optionally scoped to a topic. Call it for time-bounded "what happened lately" questions. When to use: "what's been discussed in this channel this week", "what happened with topic X in the last N days". When NOT to use: search not bounded by recency (use search_channel_facts); a synthesized answer or reasoning across the items (use ask_channel). Prerequisites: a channel_id from list_channels. Returns (instant, read-only): ``{activity: [{text, author, timestamp, channel_id, topic_tags, fact_id}, ...]}`` sorted by timestamp descending. No side effects. Error modes (returned as dicts): 'authentication_missing' (no principal); 'channel_access_denied' (token lacks access to channel_id). Other internal failures return an empty ``{activity: []}``.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Channel id. Get it from list_channels (e.g. 'ch-eng'). Required. |
| days | integer | – | Look-back window in days, 1-90 (out-of-range values are clamped). Default 7. |
| limit | integer | – | Max activity items, 1-50 (out-of-range values are clamped). Default 20. |
| topic | – | – | Optional topic filter (e.g. 'deployment'); keeps only facts tagged with that topic. Omit for all topics. Default null. |
Structured output declared, but exposes no named fields.
No examples provided.
get_tensions ~326
List unresolved TENSIONS in one channel — points of open disagreement or conflicting positions surfaced across its wiki. Call it to find what is still contested or undecided, as opposed to settled decisions (find_decisions). When to use: surfacing open conflicts, blockers, or competing stances. When NOT to use: settled decisions (find_decisions) or general fact lookup (find_facts). Prerequisites: a channel_id from list_channels. Note: tension detection is currently empty for most channels — the wiring is in place but few channels have tension data yet, so an empty result is normal and does not indicate an error. The same call returns real data automatically once tensions exist, with no signature change. Returns (instant, read-only): a LIST (not a dict) of ``{tension_id, title, status, since (YYYY-MM-DD), positions: [{author, stance, fact_id}], page_slug}``. No side effects. Error handling: on missing auth, access denial, or internal error this tool returns an EMPTY LIST ``[]`` (it never raises) — indistinguishable from "no tensions"; confirm access with list_channels if unexpected.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Channel id. Get it from list_channels (e.g. 'ch-eng'). Required. |
| status | – | – | Optional status filter. One of: 'open', 'blocked', 'deferred' (e.g. 'open'). Pass null (the default) to return tensions of ALL statuses; omit for the same effect. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
get_wiki_graph ~316
Return the map of how a channel's WIKI PAGES link to one another, as a node/edge graph. Call it to understand the wiki's structure — which pages reference which — or to plan a traversal across related pages. Disambiguation: this is the WIKI PAGE-LINK graph (nodes are wiki pages, edges are cross-links between them). For the KNOWLEDGE graph of entities and their relationships (people, systems, concepts), use search_relationships instead. When to use: visualizing or navigating wiki page structure, or finding clusters of related pages. When NOT to use: reading a page's content (use read_wiki_page) or querying entity relationships (search_relationships). Prerequisites: a channel_id from list_channels. Returns (instant, read-only): Cytoscape-format ``{channel_id, nodes: [{data: {id, label, kind, page_kind?, version?, last_updated?}}], edges: [{data: {id, source, target, kind}}]}``. Returns empty ``nodes``/``edges`` arrays (not an error) when the graph backend is unavailable, so it is always safe to call. No side effects. Error modes (returned as dicts): 'authentication_missing' (no principal); 'channel_access_denied' (token lacks access to channel_id).
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Channel id. Get it from list_channels (e.g. 'ch-eng'). Required. |
Structured output declared, but exposes no named fields.
No examples provided.
get_wiki_page ~357
Fetch one pre-compiled wiki page from the LEGACY fixed-page set (overview, faq, decisions, people, glossary, activity, topics). Call it for a fast, whole-channel summary keyed by a fixed page_type. Disambiguation: this is the legacy fixed-page surface. For the redesigned slug-keyed wiki — arbitrary topic/entity pages, structured kind payloads, and the cross-link graph — use list_wiki_pages to discover pages then read_wiki_page(slug=...). Prefer those for anything beyond the seven fixed pages above. When to use: you want a quick structured summary of a known aspect of a channel without running the QA pipeline. When NOT to use: you need a specific answer (use ask_channel) or a non-fixed wiki topic (use read_wiki_page). Prerequisites: a channel_id from list_channels. Returns (instant, read-only): the page dict ``{page_type, channel_id, content, summary, text}``. ``content`` is null when that page has not been generated yet (run a sync / refresh_wiki first). No side effects. Error modes (returned as dicts): 'authentication_missing' (no principal); 'channel_access_denied' (token lacks access to channel_id). Other internal failures return the page dict with ``content: null``.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Channel id. Get it from list_channels (e.g. 'ch-eng'). Required. |
| page_type | string | – | Which fixed page to fetch. One of exactly: 'overview', 'faq', 'decisions', 'people', 'glossary', 'activity', 'topics'. Default 'overview'. |
Structured output declared, but exposes no named fields.
No examples provided.
lint_wiki ~352
Audit a channel's wiki for health problems and return a list of findings. Call it to check whether wiki pages are stale, orphaned, duplicated, or internally inconsistent before relying on them or recommending a refresh. When to use: validating wiki quality, or diagnosing why an answer looked wrong. When NOT to use: routine reading (use read_wiki_page / list_wiki_pages) — linting is heavier. Set run_coherence_check=false to avoid the per-page LLM cost when you only need structural checks. Prerequisites: a channel_id from list_channels. Returns (long-running when run_coherence_check=true — one LLM call per page; read-only, writes nothing): ``{findings: [{severity, category, page_id, section_id, message, suggested_action}, ...], pages_scanned: N}``. Error modes (returned as dicts): 'authentication_missing' (no principal); 'channel_access_denied' (token lacks access to channel_id); 'lint_failed' (returned as ``{findings: [], error: 'lint_failed'}`` on an internal lint error).
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Channel id whose wiki to lint. Get it from list_channels (e.g. 'ch-eng'). Required. |
| run_coherence_check | boolean | – | If true, also run the LLM coherence pass (one model call per page — slower and incurs token cost). Set false for a fast structural-only lint. Default true. |
| target_lang | – | – | Optional BCP-47 language tag to lint (e.g. 'en'). Omit to lint the channel's primary language. Default null (treated as 'en'). |
Structured output declared, but exposes no named fields.
No examples provided.
list_channels ~553
List the channels the bot can actually read on one connection — the ground-truth source for what channels exist and their indexing state. Call this after ``list_connections``/``whoami`` (you need a valid ``connection_id``), once per connection you care about, BEFORE any retrieval tool (``ask_channel``, ``search_channel_facts``, ``get_wiki_page``, ...) so you can pass a real ``channel_id``. Prefer this over ``list_connections.selected_channel_count`` — that count is a sync pick-list, not the channel inventory. Latency: instant for cached results; may take a few seconds when it queries the live platform bridge. Read-only — does not trigger a sync. Returns ``{"channels": [<entry>, ...]}`` (empty list if none/bridge error). Each entry: - ``channel_id`` (str): pass to retrieval/sync tools, e.g. ``"C0A955E29MX"``. - ``name`` (str): display name, e.g. ``"engineering"``. - ``platform`` (str): e.g. ``"slack"``, ``"discord"``, ``"file"``. - ``last_sync_ts`` (str|null): ISO timestamp of last index, ``null`` if never. - ``sync_status`` (str): ``"synced"``, ``"never_synced"``, or ``"n/a"`` (file connections). ``"never_synced"`` is normal and does NOT mean the channel is inaccessible — it just is not indexed yet; call ``trigger_sync(channel_id)`` to ingest it before querying its content. - ``message_count_estimate`` (int|null): approx synced messages, ``null`` if not yet synced. Scoping: matches the dashboard "CONNECTED" view. If the user picked specific channels for sync, those are returned; otherwise every channel where the bot is a member (and thus can read) is returned. File connections return every uploaded file. Error modes: ``{"error": "connection_access_denied", "connection_id": ...}`` if you do not own the connection (existence is not leaked); ``{"error": "invalid_parameter", "parameter": "connection_id"}`` for a malformed id; ``{"error": "authentication_missing"}`` if no principal.
| Name | Type | Req | Description |
|---|---|---|---|
| connection_id | string | yes | Id of the connection whose channels to list, obtained from list_connections or whoami. Format: alphanumeric/_/:/- up to 128 chars. Example: "conn_abc123". |
Structured output declared, but exposes no named fields.
No examples provided.
list_connections ~470
List the platform connections (Slack workspaces, Discord servers, file imports, etc.) this principal owns, with each connection's metadata. Use this when you need a connection's platform, status, or sync metadata — not just its id. If you only need the connection ids, ``whoami`` is cheaper. After picking a connection here, call ``list_channels(connection_id)`` to see its actual channels. Results are ownership-filtered: you only see your own. Latency: instant (read-only; no sync triggered). Returns ``{"connections": [<entry>, ...]}`` (empty list if none). Each entry: - ``connection_id`` (str): e.g. ``"conn_abc123"`` — pass to ``list_channels``. - ``platform`` (str): e.g. ``"slack"``, ``"discord"``, ``"file"``. - ``display_name`` (str): human label, e.g. ``"Acme Workspace"``. - ``status`` (str): connection health, e.g. ``"connected"``. - ``last_synced_at`` (str|null): ISO timestamp of the most recent sync of a PICKED channel; ``null`` when the pick-list is empty (see caveat below). - ``selected_channel_count`` (int): size of the sync pick-list (see caveat). - ``source`` (str): how the connection was created, e.g. ``"oauth"``. Caveats (do NOT misread): ``selected_channel_count`` is the user's opted-in sync pick-list, NOT how many channels exist. A value of ``0`` does not mean the connection is empty — a Slack workspace with 0 picks can still have dozens of bot-readable channels. ``last_synced_at`` is scoped to the same pick-list, so an empty pick-list yields ``null`` even if channels were synced another way. For ground-truth channel availability, always call ``list_channels(connection_id)`` — never infer it from these counts. Error modes: returns ``{"error": "authentication_missing"}`` when no valid principal is attached. Never raises access-denied (output is self-scoped).
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
list_wiki_pages ~365
List the wiki pages in one channel as lightweight summaries (no page bodies). The RECOMMENDED first call when exploring the redesigned slug-keyed wiki: use it to discover slugs, then fetch a page with read_wiki_page(slug=...). When to use: browsing or discovering which pages exist, or finding a slug. When NOT to use: you already know the slug and want the body (call read_wiki_page directly). Prerequisites: a channel_id from list_channels. Returns (instant, read-only): ``{channel_id, target_lang, scope, pages: [{slug, title, kind, version, last_updated, pinned, hidden}, ...]}``. The ``content_md`` body is intentionally omitted to keep the payload bounded — follow up with read_wiki_page(slug=...) for a page's content. No side effects. Error modes (returned as dicts): 'authentication_missing' (no principal); 'channel_access_denied' (token lacks access to channel_id); 'wiki_list_failed' (internal error).
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Channel id. Get it from list_channels (e.g. 'ch-eng'). Required. |
| kind | – | – | Optional kind filter. One of: 'topic', 'entity', 'decisions', 'faq', 'action_items'. Omit for all kinds. Default null. |
| scope | string | – | Visibility scope. 'human' (default) excludes hidden + merged pages; 'all' returns everything but requires the read:hidden_pages token scope (otherwise it silently downgrades to 'human'). |
| target_lang | string | – | BCP-47 language tag (e.g. 'en', 'fr'). Default 'en'. |
Structured output declared, but exposes no named fields.
No examples provided.
read_provenance ~313
Trace ONE fact back to the original chat message it was extracted from. Call it to verify or cite a fact — given a fact_id from another tool, it returns where the fact came from (platform, message, author, timestamp, and the raw message text when reachable). When to use: confirming a fact's source, building a citation, or auditing provenance. Prerequisites: a fact_id surfaced by find_facts, find_decisions, search_channel_facts, search_memory, or an ask_channel citation. Returns (instant, read-only): ``{fact_id, memory_text, source: {platform, message_id, url, author, ts}, raw_message}``. ``raw_message`` is the original chat body, or an empty string if the source message is no longer reachable — every other field is still populated in that case. No side effects. Error modes (returned as dicts): 'authentication_missing' (no principal); 'fact_not_found' (unknown fact_id — also returned, deliberately, when the caller lacks access to the fact's channel, so cross-tenant existence is never leaked); 'provenance_read_failed' (internal error).
| Name | Type | Req | Description |
|---|---|---|---|
| fact_id | string | yes | Fact id to trace, as returned in the ``fact_id`` field of another tool's result (e.g. 'fact_abc123' from find_facts, find_decisions, search_channel_facts, or ask_channel citations). Required. |
Structured output declared, but exposes no named fields.
No examples provided.
read_wiki_module ~415
Fetch ONE structured module from a wiki page without downloading the whole page. Call it when you already know the page slug and the module anchor you want, and reading the full page via read_wiki_page would waste tokens. When to use: you need just one module's structured data (e.g. the key_facts items, or a decision_banner's rationale + alternatives). When NOT to use: you need a narrative prose section (use read_wiki_section) or the whole page (use read_wiki_page). To learn a page's module anchors, read it once with read_wiki_page first. Prerequisites: a channel_id (list_channels), a page_slug (list_wiki_pages), and an anchor (from the page's modules). Returns (instant, read-only): ``{channel_id, page_slug, anchor, module_id, data}`` where ``data`` is the module's structured payload. No side effects. Error modes (returned as dicts): 'authentication_missing' (no principal); 'channel_access_denied' (token lacks access to channel_id); 'wiki_page_not_found' (no such slug); 'module_not_found' (page exists but has no module with that anchor); 'wiki_module_read_failed' (internal error).
| Name | Type | Req | Description |
|---|---|---|---|
| anchor | string | yes | Module anchor — the stable in-page id of one structured module (e.g. 'key-facts', 'decision-banner', 'tension-callout'). Discover the available anchors by reading the page once with read_wiki_page. R… |
| channel_id | string | yes | Channel id. Get it from list_channels (e.g. 'ch-eng'). Required. |
| page_slug | string | yes | Slug of the page hosting the module (e.g. 'auth-architecture'). Discover slugs via list_wiki_pages. Required. |
| target_lang | string | – | BCP-47 language tag (e.g. 'en', 'fr'). Default 'en'. |
Structured output declared, but exposes no named fields.
No examples provided.
read_wiki_page ~419
Read ONE full wiki page by its slug from the redesigned slug-keyed wiki. Call it after list_wiki_pages tells you which slug you want, to get a page's complete content and structured payload. Disambiguation: this is the slug-keyed redesign surface (arbitrary topic/entity pages). For the seven LEGACY fixed pages (overview, faq, decisions, ...) use get_wiki_page(page_type). Typical sequence: list_wiki_pages -> read_wiki_page(slug). To save tokens when you need only a slice, use read_wiki_module (one module) or read_wiki_section (one narrative section) instead of the whole page. Prerequisites: a channel_id from list_channels and a slug from list_wiki_pages. Returns (instant, read-only): the full WikiPage document including ``content_md`` (markdown body), ``kind`` + ``kind_schema`` (structured payload agents can iterate without re-parsing markdown), ``cross_links`` (title->slug), ``cross_links_broken`` (linked titles with no page yet), ``pin_state``, and ``last_updated``. Hidden pages are excluded unless the token carries the ``read:hidden_pages`` scope. No side effects. Error modes (returned as dicts): 'authentication_missing' (no principal); 'channel_access_denied' (token lacks access to channel_id); 'wiki_page_not_found' (no such slug, or it is hidden and the token lacks read:hidden_pages); 'wiki_read_failed' (internal error).
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Channel id. Get it from list_channels (e.g. 'ch-eng'). Required. |
| slug | string | yes | Page slug — the stable identifier of the page (e.g. 'auth-architecture'). Discover valid slugs with list_wiki_pages. Required. |
| target_lang | string | – | BCP-47 language tag for the rendered page (e.g. 'en', 'fr'). Default 'en'. |
Structured output declared, but exposes no named fields.
No examples provided.
read_wiki_section ~443
Fetch ONE narrative (prose) section of a wiki page without loading the whole page. Call it when you know the page slug and section anchor and want just that article slice, to save tokens. Disambiguation: read_wiki_section returns PROSE sections (paragraphs + citations); read_wiki_module returns a STRUCTURED module payload (key_facts, decision_banner, etc.); read_wiki_page returns the whole page. Use find_facts for fact-text search across pages. Prerequisites: a channel_id (list_channels), a page_slug (list_wiki_pages), and an anchor (from the page's narrative sections). Returns (instant, read-only): ``{anchor, heading, paragraphs, citations, visual, page_slug, page_title, channel_id}`` — ``page_title`` and ``channel_id`` are included so you can attribute the section without a second call. No side effects. Error modes (returned as dicts): 'authentication_missing' (no principal); 'channel_access_denied' (token lacks access to channel_id); 'page_not_found' (no such slug); 'section_not_found' (page exists but lacks the anchor — the result lists ``available_anchors`` to retry with); 'narrative_not_available' (page has no narrative sections — includes ``has_modules`` and a suggestion to use read_wiki_page for module data); 'internal_error'.
| Name | Type | Req | Description |
|---|---|---|---|
| anchor | string | yes | Section anchor — kebab-case in-page id of one narrative section (e.g. 'context', 'alternatives', 'implications'). If you don't know it, a 'section_not_found' error lists the available anchors. Requir… |
| channel_id | string | yes | Channel id. Get it from list_channels (e.g. 'ch-eng'). Required. |
| page_slug | string | yes | Slug of the page hosting the section (e.g. 'auth-architecture'). Discover slugs via list_wiki_pages. Required. |
| target_lang | string | – | BCP-47 language tag (e.g. 'en', 'fr'). Default 'en'. |
Structured output declared, but exposes no named fields.
No examples provided.
refresh_wiki ~452
Re-render a channel's pre-compiled wiki pages (overview, FAQ, decisions, etc.) from facts ALREADY ingested into the knowledge base. Use this to rebuild stale wiki content; the refreshed pages are then read with get_wiki_page / read_wiki_page / list_wiki_pages. It does NOT ingest new messages — that is trigger_sync's job — and it does NOT answer questions (use the retrieval tools for that). WHEN TO USE: after a sync has added new facts (i.e. after trigger_sync completes), or when the user explicitly asks to regenerate the wiki. WHEN NOT TO USE: do not call routinely — the standard sync pipeline already rebuilds wiki pages automatically, so calling this after a normal sync is usually redundant. PREREQUISITES: a valid channel_id from list_channels; the channel must have ingested facts (run trigger_sync first if it has none); the calling principal must have access. LATENCY & SIDE EFFECTS: asynchronous and expensive (runs an LLM generation pass). Returns within ~5s with a job envelope while generation runs in the background; this WRITES/overwrites the channel's wiki pages. Shape: {job_id: 'job_def456', status_uri: 'atlas://job/job_def456', status: 'queued'}. Track progress with get_job_status(job_id) or the atlas://job/<job_id> resource. ERROR MODES (returned as {error: ...}, never raised): 'authentication_missing'; 'invalid_parameter' (malformed channel_id); 'channel_access_denied'; 'cooldown_active' (refreshed too recently; includes retry_after_seconds); 'service_unavailable' (includes service); 'internal_error'.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Channel whose wiki pages to regenerate, e.g. 'ch_eng_backend'. Get it from list_channels. Required. |
| page_types | – | – | Subset of wiki page types to regenerate, e.g. ['overview', 'faq']. Valid values: 'overview' | 'faq' | 'decisions' | 'people' | 'glossary' | 'activity' | 'topics'. Default None, which regenerates ALL… |
Structured output declared, but exposes no named fields.
No examples provided.
search_channel_facts ~364
Find SPECIFIC facts in ONE channel by hybrid (BM25 + vector) search and return them as raw, ranked rows. Call it when you want the cited source facts themselves, not a composed answer. When to use: targeted lookup of facts in a known channel ("find facts about the postgres migration"). Faster and more precise than ask_channel for retrieval-only tasks. When NOT to use: you need a synthesized answer with reasoning (use ask_channel); you don't know which channel holds the facts (use search_memory, which fans this same search across every accessible channel); you want a deterministic substring match rather than ranked relevance (use find_facts). Prerequisites: a channel_id from list_channels. Returns (instant, read-only): ``{facts: [{text, author, timestamp, permalink, channel_id, confidence, topic_tags}, ...]}``. No side effects. Error modes (returned as dicts): 'authentication_missing' (no principal); 'channel_access_denied' (token lacks access to channel_id). On any other internal failure it returns an empty ``{facts: []}`` rather than erroring.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Channel id to search. Get it from list_channels (e.g. 'ch-eng'). Required. |
| limit | integer | – | Max facts to return, 1-50 (values outside the range are clamped). Default 10. |
| query | string | yes | Search query, keyword or natural phrase (e.g. 'postgres migration'). Matched with BM25+vector hybrid retrieval. Required. |
| time_scope | string | – | Time window. 'any' = all facts (default), 'recent' = last 30 days only. |
Structured output declared, but exposes no named fields.
No examples provided.
search_channel_knowledge ~114
DEPRECATED — do not call. This is a compatibility shim for the retired 'search_channel_knowledge' tool. Use 'ask_channel' for natural-language questions answered with citations, or 'search_channel_facts' for targeted keyword+vector fact search within one channel. Calling this always returns a structured {"error": "tool_renamed", "replacement": [...]} payload and performs no work (no backend call, exempt from rate limiting).
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | – | – |
| query | string | – | – |
Structured output declared, but exposes no named fields.
No examples provided.
search_media_references ~327
Find messages that SHARED a file, image, PDF, or link in one channel. Call it when the user is hunting for an attachment or URL ("where's the design doc", "find the screenshot Alice posted") rather than for the knowledge in the text. When to use: locating shared documents, images, or links. When NOT to use: general fact/knowledge search (use search_channel_facts or ask_channel) — this tool only returns messages that carry media. Prerequisites: a channel_id from list_channels. Returns (instant, read-only): ``{media: [{text, media_urls, link_urls, link_titles, author, timestamp, media_type, fact_id}, ...]}``. No side effects. Error modes (returned as dicts): 'authentication_missing' (no principal); 'channel_access_denied' (token lacks access to channel_id). Other internal failures return an empty ``{media: []}``.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Channel id. Get it from list_channels (e.g. 'ch-eng'). Required. |
| limit | integer | – | Max results, 1-20 (out-of-range values are clamped). Default 5. |
| media_type | – | – | Optional media-type filter. One of: 'image' (photos/screenshots), 'pdf' (documents), 'link' (URLs), or null for all. Default null. |
| query | string | yes | Search query describing the media you want (e.g. 'architecture diagram' or 'pricing pdf'). Required. |
Structured output declared, but exposes no named fields.
No examples provided.
search_memory ~448
Find facts ACROSS MANY channels by hybrid (BM25 + vector) search when you do NOT know which channel holds the answer. Call it first for broad recall, then drill into a specific channel with the tools below. Routing rule for the three search tools: - search_memory(scope='all') — unknown channel; fans the search across every channel the principal can access and merges/ranks the hits. - search_channel_facts(channel_id) — known channel; same hybrid search, scoped to one channel, returning the richer per-fact shape. - search_memory(scope='channel:<id>') — single channel with the search_memory hit shape (use search_channel_facts instead if you want author/permalink/topic_tags on each row). For a synthesized ANSWER rather than rows, use ask_channel. Prerequisites: none for scope='all'; a channel_id (from list_channels) for scope='channel:<id>'. Returns (instant for one channel, longer when fanning across many; read-only): ``{hits: [{fact_id, text, score, channel_id, cluster_id, entity_tags}, ...], query: <echo of query>}`` ranked by hybrid score. No side effects. Error modes (returned as dicts): 'authentication_missing' (no principal); 'invalid_parameter' (empty/over-4000-char query, or scope not 'all'/ 'channel:<id>'); 'channel_access_denied' (only for an explicit 'channel:<id>' the token cannot reach — under scope='all' unreachable channels are silently skipped).
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max hits across the merged result set, 1-50 (out-of-range values are clamped). Default 20. |
| query | string | yes | Search query, keyword or natural phrase, 1-4000 chars (e.g. 'who owns billing'). Longer queries return error 'invalid_parameter'. Required. |
| scope | string | – | Search scope. 'all' (default) = every channel the principal can access; 'channel:<id>' = one channel only (e.g. 'channel:ch-eng'). |
Structured output declared, but exposes no named fields.
No examples provided.
search_relationships ~531
Find how named ENTITIES connect in a channel's knowledge graph. Call this to answer "how is X related to Y?" or "what touches the billing service?" by returning the subgraph of nodes and edges around the given entities. This explores the KNOWLEDGE graph of entities/relationships — distinct from ``get_wiki_graph``, which returns the wiki PAGE-LINK graph (which wiki pages reference which). Use ``find_experts`` to rank people and ``trace_decision_history`` to follow decision supersession. Prerequisite: a ``channel_id`` from ``list_channels`` and at least one entity name. Names should match how the channel refers to the entity; unknown names simply yield an empty subgraph. Returns (instant for small hop counts, read-only, no side effects): ``{"nodes": [...], "edges": [...], "text": str, "entities_searched": [...]}``. Each node has ``name`` and ``type`` (e.g. 'person', 'system', 'concept'); each edge has ``source``, ``target``, ``type`` (relationship label), ``confidence`` (0–1, extraction confidence), and ``context`` (snippet explaining the edge). ``text`` is a human-readable summary. Empty ``nodes``/ ``edges`` means no connections were found — not an error. Error modes: ``{"error": "authentication_missing"}`` if unauthenticated; ``{"error": "channel_access_denied", "channel_id": ...}`` if the channel is not readable; ``{"error": "invalid_parameter", ...}`` for a malformed ``channel_id``. Other backend failures degrade to ``{"nodes": [], "edges": [], "channel_id": ...}``.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Required. The channel id to search within, obtained from list_channels (e.g. 'ch-eng'). Not a human channel name. |
| entities | array | yes | Required. One or more entity NAMES to connect, e.g. ['Postgres', 'billing-service'] or ['Dana']. These are knowledge-graph node names (people, systems, concepts), not channel ids. Provide at least on… |
| hops | integer | – | How many graph edges to traverse out from the entities. Range 1–4, default 2. Larger values return wider but noisier subgraphs and are slower. Out-of-range values are silently clamped (e.g. 9 -> 4). |
Structured output declared, but exposes no named fields.
No examples provided.
start_new_session ~326
Mint a fresh conversation session id that starts a new ``ask_channel`` thread. Call this to begin a clean conversation that carries no memory of prior ``ask_channel`` turns — e.g. when the user switches to an unrelated topic or explicitly asks to "start over" / "forget previous context". Pass the returned id as the ``session_id`` argument on subsequent ``ask_channel`` calls so they share one continuous thread; reuse the same id for follow-ups, and mint a new one only when you want a clean break. When NOT to use: do not call this before every question. ``ask_channel`` auto-creates a session when ``session_id`` is omitted, so a new session id is only needed to intentionally drop earlier conversation context. Prerequisites: none. Requires an authenticated MCP principal (the caller's connection token); no ``channel_id`` or other input is needed. Returns: a dict ``{"session_id": "mcp:<principal>:<short>"}`` where the value is a fresh opaque conversation handle scoped to the caller, e.g. ``{"session_id": "mcp:conn_abc123:9f3c1a2b"}``. On a missing or invalid principal it returns ``{"error": "authentication_missing"}`` instead. Side effects: none — this allocates a new conversation boundary marker and does not delete, persist, or mutate any stored data. Latency: instant (no network or LLM call); safe to call synchronously inline.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
trace_decision_history ~454
Reconstruct how a decision EVOLVED over time in a channel. Call this to answer "how did the team arrive at the current approach for X?" or "what earlier choices were overridden?" It walks ``SUPERSEDES`` edges in the knowledge graph to build an ordered timeline of superseded → current decisions. Distinct from ``find_decisions`` (which lists current decision facts with no history) and ``search_channel_facts`` (current state only, no chronology); use this tool specifically when you need the chronological "why we changed" trail. Prerequisite: a ``channel_id`` from ``list_channels``. Best results on mature channels where decisions have been revised; new channels often have no supersession chain yet (empty result, not an error). Returns (instant, read-only, no side effects): ``{"decisions": [...]}`` ordered oldest → newest. Each item has ``entity`` (the decision that was made), ``superseded_by`` (the decision that replaced it, or empty for the current one), ``relationship`` (edge label, typically 'SUPERSEDES'), ``confidence`` (0–1 extraction confidence), ``context`` (snippet explaining the change), and ``position`` (0-based index in the timeline). An empty list means no recorded supersession chain. Error modes: ``{"error": "authentication_missing"}`` if unauthenticated; ``{"error": "channel_access_denied", "channel_id": ...}`` if the channel is not readable; ``{"error": "invalid_parameter", ...}`` for a malformed ``channel_id``. Other backend failures degrade to ``{"decisions": []}``.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Required. The channel id to trace within, obtained from list_channels (e.g. 'ch-eng'). Not a human channel name. |
| topic | string | yes | Required. The decision area to trace, e.g. 'database choice', 'API versioning', 'auth provider'. Matched against decision entities in the knowledge graph; use the subject of the decision, not a yes/n… |
Structured output declared, but exposes no named fields.
No examples provided.
trigger_sync ~601
Ingest a chat channel's messages into the Atlas knowledge base so they become searchable by the retrieval tools (ask_channel, search_channel_facts, search_memory). This is the WRITE/ingestion entry point; it does NOT answer questions — use the retrieval tools for that. It is distinct from refresh_wiki, which only re-renders wiki pages from already-ingested facts. WHEN TO USE: only when the user EXPLICITLY asks to sync/refresh a channel, OR when retrieval tools return empty/stale results AND the channel was last synced over 24h ago. WHEN NOT TO USE: do not call before every question or as a precautionary warm-up — prefer the data already indexed. Sync is expensive and rate-limited (cooldown) per channel. PREREQUISITES: get a valid channel_id (and ideally connection_id) from list_channels first. The calling principal must have access to the channel. LATENCY & SIDE EFFECTS: asynchronous. Returns within ~5s with a job envelope while ingestion runs in the background; this WRITES facts to the knowledge base. Shape: {job_id: 'job_abc123', status_uri: 'atlas://job/job_abc123', status: 'queued'}. Track progress by calling get_job_status(job_id) or reading the atlas://job/<job_id> resource. IDEMPOTENT: if a queued or running sync already exists for the channel, its existing job_id is returned instead of starting a duplicate. A new job is created only when no active job exists, or after the prior one completed or failed. ERROR MODES (returned as {error: ...}, never raised): 'authentication_missing' (no principal); 'invalid_parameter' (malformed channel_id/connection_id); 'channel_access_denied' (principal lacks access); 'cooldown_active' (synced too recently; includes retry_after_seconds); 'service_unavailable' (backing service down; includes service); 'internal_error' (unexpected failure).
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | Channel to sync, e.g. 'ch_eng_backend'. Get it from list_channels. Required. |
| connection_id | – | – | Platform connection that owns the channel, e.g. 'conn_slack_acme'. Get it from list_channels or list_connections. Default None. Optional but STRONGLY RECOMMENDED when multiple same-platform connectio… |
| sync_type | string | – | Sync mode. 'incremental' (default) fetches only messages newer than the last sync (cheap); 'full' re-fetches the entire history (expensive); 'auto' lets the server pick based on sync history. Valid v… |
Structured output declared, but exposes no named fields.
No examples provided.
whoami ~267
Confirm who you are authenticated as and which connection ids you can reach. Call this FIRST in any session, before any other tool, to (1) verify your auth token resolved to a principal and (2) get the connection ids needed by ``list_channels``. Returns only connection IDS here; use ``list_connections`` when you also need each connection's platform, status, and sync metadata. When to use: once at session start. Do NOT call repeatedly — the response is stable for the whole session. Latency: instant (single in-memory/DB lookup; never triggers a sync or job). Returns a dict: - ``principal_id`` (str): your authenticated identity, e.g. ``"user_42"``. - ``connections`` (list[str]): connection ids you may access, e.g. ``["conn_abc123", "conn_def456"]``. Empty list if you own no connections. - ``server_version`` (str): deployed Atlas version, e.g. ``"0.1.0"``. Error modes: returns ``{"error": "authentication_missing"}`` when the request carries no valid principal (token absent/invalid). No access-denied path — the response is always scoped to the caller.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
How do I install the io.github.Beever-AI/beever-atlas MCP server?
io.github.Beever-AI/beever-atlas runs locally as a container image, launched with docker run --rm -i ghcr.io/beever-ai/beever-atlas:0.3.0. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.
oci · ghcr.io/beever-ai/beever-atlas:0.3.0
claude mcp add beever-ai-beever-atlas -- docker run --rm -i ghcr.io/beever-ai/beever-atlas:0.3.0
What is the io.github.Beever-AI/beever-atlas MCP server?
io.github.Beever-AI/beever-atlas is an MCP server listed in the public MCP registry as io.github.Beever-AI/beever-atlas. Open-source LLM knowledge base: team chat into a typed knowledge graph and auto-generated wiki. This page covers its container image (ghcr.io/beever-ai/beever-atlas:0.3.0).
Is the io.github.Beever-AI/beever-atlas MCP server safe to use?
io.github.Beever-AI/beever-atlas scores 66 out of 100 on VerifyMCP. The SBOM its publisher attached lists packages with 248 known advisories as of 4 November 2026. We do not grade that SBOM, as nothing verifies it. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.Beever-AI/beever-atlas MCP server expose?
io.github.Beever-AI/beever-atlas exposes 28 tools: search_channel_knowledge, whoami, list_connections, list_channels, ask_channel, and 23 more. Their descriptions and schemas cost roughly 11,114 tokens of context every time the server is loaded.
Is the io.github.Beever-AI/beever-atlas MCP server still maintained?
io.github.Beever-AI/beever-atlas is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the io.github.Beever-AI/beever-atlas MCP server under?
io.github.Beever-AI/beever-atlas declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.