Tableau Knowledge MCP
You can inspect and enrich a Tableau Knowledge graph, trace lineage and impact, manage semantic contexts, port semantic layers via Apache Ossie, and validate Business Preferences.
Connect to a Tableau site and list knowledge graphs, versions, auth, and Knowledge availability.
Semantically search graph nodes by meaning, with scores and alternatives.
Get node details, child nodes, and edges around a node.
Trace upstream/downstream lineage and run transitive impact analysis.
List published data sources and workbooks the graph is built from.
Search and read business semantic contexts, including graph-wide and node-attached statements.
Check graph health, coverage, and prioritized improvement suggestions.
Create, update, and delete user-managed semantic contexts (write access limited to these).
Export a published data source to Apache Ossie YAML with validation and loss reporting.
Validate Ossie models locally and read the Ossie guide/reference topics.
Import an Ossie model into Tableau Knowledge as semantic contexts, with a reviewable plan before applying.
Check Tableau Business Preferences files for format, limits, wording issues, and field-name mismatches.
Supports Apache Ossie (formerly Open Semantic Interchange, OSI) semantic models: exports published Tableau data sources to Ossie YAML, imports Ossie descriptions, synonyms, and definitions back into Tableau Knowledge, validates Ossie documents against the schema and semantic rules, and provides an Ossie reference guide for porting and hand-editing models.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Tableau Knowledge MCPWhich fields mean revenue, and where do they come from?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
biztory-tableau-knowledge-mcp turns your site's Tableau Knowledge Graph API into seventeen MCP tools, so an AI assistant (Claude, Cursor, VS Code, Cline, and others) can work with the graph in plain language:
"Which fields mean revenue, and where do they come from?"
"If the Superstore data source changes, which workbooks and dashboards are affected?"
"What business context is attached to Profit? Add: 'Profit is after returns, in EUR.'"
"How healthy is our graph, and what are the five highest-impact fixes?"
"Export Superstore to Apache Ossie so we can port it to Snowflake."
"Write the Business Preferences for the P&L dashboard."
It ships nine read tools (semantic search, node lookup, edges, lineage, impact, sources, semantic contexts, graph health, and a connection probe) and three write tools that only touch semantic contexts, the business statements that make the graph useful to people and to AI. Four more tools port semantic layers through Apache Ossie (formerly Open Semantic Interchange, OSI), the open standard that Snowflake, dbt, Power BI, Databricks, Tableau Next and others convert to and from. And one checks Business Preferences files line by line against the fields the agent will actually see.
Why it's different
Ask by meaning, not by id. Every read tool takes a node id or a description ("the net sales field"). Descriptions resolve through the graph's own semantic search, and the answer says which node it picked, with the match score and runners-up, so a wrong guess is visible instead of silent.
Answers, not payloads.
impact_analysisgroups and counts everything downstream by type;lineageadds node and edge counts;graph_healthcaps hundreds of suggestions to the top ones while keeping every total.Errors tell the model what to do next. Tableau's error codes become concrete steps (
site_not_entitled→ an admin must enable Knowledge;no_active_graph→ pass agraph_id; no embedder → use exact ids), with thetrace_idkept for support. Rate limits are retried withRetry-After.Writes you can trust. Only semantic contexts can be written. Write tools take exact ids (a fuzzy match never decides where a write lands), validate before sending, carry honest MCP annotations so clients ask first, and
delete_semantic_contextreturns what it deleted.Port your semantic layer.
export_to_ossieturns a published data source into a validated Ossie model, with Tableau calcs translated to portable SQL wherever that is exact and a loss report for everything else.import_from_ossiebrings descriptions, synonyms and definitions from any Ossie model back into Tableau Knowledge, with a reviewable plan first.Tiny and hardened. Stdio only (no inbound port), secrets from env only, HTTPS enforced, redirects refused, ids encoded so they can never reach another endpoint, fuzzed parsers, and two runtime dependencies: the MCP SDK and PyYAML (stdlib
urllibfor HTTP).
Requirements
Tableau Knowledge is a Tableau Cloud feature (September 2026 and later, Tableau+ license); it is not available on Tableau Server. Any user can read the graph, filtered by their content permissions. Writing semantic contexts needs the Creator role.
Related MCP server: Tableau MCP Server
Quickstart
You need uv (curl -LsSf https://astral.sh/uv/install.sh | sh) and a Tableau Personal Access Token.
Claude Code, one line:
claude mcp add tableau-knowledge \
-e TABLEAU_SERVER=https://10ax.online.tableau.com \
-e TABLEAU_SITE_CONTENT_URL=YourSite \
-e TABLEAU_PAT_NAME=my-token \
-e TABLEAU_PAT_SECRET=the-full-secret \
-- uvx biztory-tableau-knowledge-mcpThat's all. uvx fetches the package from PyPI and runs it in an isolated environment; nothing to clone or install. Then ask: "Use server_info: what graphs does my site have?"
Configuration
All configuration is via environment variables (set them in your client's env block, never on the command line).
Env var | Required | Default | Description |
| yes | n/a |
|
| yes |
| Site slug (the part after |
| yes¹ | n/a | Personal Access Token name. |
| yes¹ | n/a | PAT secret: the whole string, do not split on |
| no | primary graph | Default graph for every tool. |
| no |
| Per-request timeout (seconds). |
| no | auto | REST version used for sign-in; else read from serverinfo. (The Knowledge API itself is always |
| no | off | Set to |
| no |
|
|
| no | n/a | Advanced: a pre-obtained |
¹ Provide a PAT (TABLEAU_PAT_NAME + TABLEAU_PAT_SECRET) or TABLEAU_AUTH_TOKEN.
Edit claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\):
{
"mcpServers": {
"tableau-knowledge": {
"command": "uvx",
"args": ["biztory-tableau-knowledge-mcp"],
"env": {
"TABLEAU_SERVER": "https://10ax.online.tableau.com",
"TABLEAU_SITE_CONTENT_URL": "YourSite",
"TABLEAU_PAT_NAME": "my-token",
"TABLEAU_PAT_SECRET": "the-full-secret"
}
}
}
}Fully quit and reopen Claude Desktop, then check the tools menu.
Use the Add to Cursor / Add to VS Code buttons above and fill in the env values, or add the same block as for Claude Desktop to:
Cursor:
~/.cursor/mcp.json(global) or.cursor/mcp.json(project).VS Code:
.vscode/mcp.json(the top-level key there isserversinstead ofmcpServers).Cline: the MCP Servers panel, then Configure, into
cline_mcp_settings.json.Windsurf:
~/.codeium/windsurf/mcp_config.json.
On Windows, if uvx isn't found by the GUI app, use its absolute path (e.g. %USERPROFILE%\.local\bin\uvx.exe).
Tools
node arguments accept a node id or a plain-language description. Every graph-scoped tool also takes an optional graph_id.
Tool | What it does | Key args |
| Site, versions, auth, whether Knowledge is enabled, and every graph (id, name, status, primary). Good first call. | none |
| Semantic search over the graph ("revenue" finds "Net Sales"), ranked with scores. |
|
| One node: properties, attached semantic statements, child nodes. |
|
| The edges around one node, with direction and the node on the other end. |
|
| Upstream and downstream neighborhood (10 steps) along lineage/dependency edges, with counts. |
|
| Everything that depends on a node, transitively, grouped and counted by type. |
|
| The published data sources and workbooks the graph is built from. |
|
| Business statements on the graph: all, graph-wide only, or attached to one node. |
|
| Health score, coverage metrics, and prioritized improvement suggestions. |
|
| (write) Attach statements to one node (exact id) or to the whole graph. |
|
| (write) Replace statements, rename, re-attach, or make graph-wide. |
|
| (write) Delete a user-managed context; returns what was deleted. |
|
| A published data source as an Apache Ossie model (YAML), plus validation and a loss report. |
|
| Check any Ossie model (YAML/JSON) against the official schema and the spec's rules. Local only. |
|
| (write) Plan, then apply, the semantic contexts an Ossie model adds to a data source. |
|
| Reference for Ossie: object model, expressions, Tableau mapping, converters, porting playbook. Local only. |
|
| Check a Business Preferences file (format, limits, wording) and every field it names against the dashboard's captions. No text: the rulebook. |
|
Write tools are annotated readOnlyHint: false (update, delete and import also destructiveHint: true) so your client can ask before each one. Tableau-managed (SEMANTIC_CONTEXT_EXTERNAL) contexts are read-only.
Port your semantic layer with Apache Ossie
Apache Ossie (incubating, formerly Open Semantic Interchange) is a vendor-neutral YAML standard for semantic models. There was no converter for classic Tableau; this server is one, built on the Knowledge graph, so the business context travels too.
Tableau → Ossie (export_to_ossie):
Tableau Knowledge | Ossie |
Published data source | Model ( |
Logical table | Dataset |
Column field | Field ( |
Row-level calc | Field, Tableau formula in the |
Aggregate calc | Metric (dataset-scoped, or model-scoped with qualified names when it spans tables) |
|
|
Default aggregation of a measure | Metric ( |
Descriptions and semantic contexts |
|
Ids, captions, roles, original formulas |
|
The export validates its own output and returns a losses list. Knowledge has no physical table paths or join keys, so source and relationships need filling in. INCLUDE/EXCLUDE LODs, table calcs, parameters and some functions stay Tableau-only, each named in the report.
Ossie → Tableau Knowledge (import_from_ossie): the Knowledge API can write semantic contexts, so that is what an Ossie model becomes. Descriptions, ai_context instructions, synonyms ("Also known as…"), example questions and metric definitions land on the matching nodes, one ossie:<model> context per node. Matching uses the ids from a previous export first, then names. On sites that accept only graph-wide context through the API, the same statements become one global ossie:<model> context, each prefixed with what it describes (Superstore / Sales: Also known as: revenue.); scope forces node or global. The first call returns the plan (create / update / unchanged, plus anything unmatched), and nothing is written until apply=true. Statements Tableau already holds are skipped, so re-importing an unedited export writes nothing.
Slash commands. The server ships MCP prompts that walk through each workflow: Export a data source to Ossie, Import an Ossie model into Tableau Knowledge, and Write Business Preferences. In Claude Code they appear as /mcp__tableau-knowledge__export_datasource_to_ossie and /mcp__tableau-knowledge__import_ossie_into_tableau_knowledge (with the server name you chose).
Onward to other platforms. Converters exist for Snowflake, dbt, Power BI, Databricks, Tableau Next, Cube, ThoughtSpot, Omni, Sigma and more. None are on PyPI yet, so ossie_guide (topic converters) gives the exact commands, pinned to a reviewed commit. The server will wrap them as tools once they are published.
Write Business Preferences that work
A Business Preferences file is the list of # rule lines Tableau's agent reads before it answers: one file per dashboard on Tableau Cloud (50 rules, 8,000 characters), one per semantic model on Tableau Next (30,000 characters). It shapes how the agent plans an answer, so every line has to be one it can follow. check_business_preferences encodes the field-tested lessons from Business Preferences in Tableau Cloud: What We Learned (Celia Fryar, XeoMatrix, September 2026):
Format slips that Tableau silently ignores: a space before
#, no space after it.Limits with headroom; no headers, blank lines or duplicates; no contradictions.
Wording that misleads the agent: thresholds without "use only this value", formatting rules that leak into the query, conversational lines, absences that can be over-read, ambiguous ordering and averages. It also suggests the two baseline rules (keep queries numeric, fail honestly) when they are missing.
Field names, checked live: give it the dashboard, and every
[Field]must be a visible caption the agent will see, with "did you mean" suggestions. It also flags workbook problems: duplicate (Account ID (Account)), generic (Amount) and helper fields.
The write_business_preferences prompt runs the whole loop. It gathers the real captions, asks you for terms, thresholds and policies, then drafts and checks until clean, and returns v1 with the upload-then-publish and testing advice. Call check_business_preferences with no text for the full rulebook.
How a description becomes a node
# illustrative
"the net sales field"
│ 1. exact lookup: GET /nodes/{id} → found? use it, no guessing
│ 2. not an id: semantic search (top 4) → best match + runners-up
▼
{ "id": "field:…:Net Sales", …,
"resolution": { "match": {"name": "Net Sales", "type": "FIELD", "score": 0.82},
"alternatives": [ … ],
"note": "Not an exact id: resolved by semantic search …" } }The model sees the score and the alternatives, so it can confirm with you or retry with an alternative's id. Write tools skip this step entirely and require exact ids.
Example prompts
"Use server_info: which graphs does this site have, and which is primary?"
"Find the fields that mean revenue, then show the lineage of the best match."
"Run impact_analysis on the Superstore data source: which workbooks and dashboards depend on it?"
"What semantic context is attached to the Profit field?"
"Show the graph's health score and the five high-severity suggestions, with the nodes they target."
"Add a statement to the Profit field: 'Profit is calculated after returns and reported in EUR.'"
Architecture
The server speaks MCP over stdio to the client and HTTPS to Tableau: it signs in with your PAT to get an X-Tableau-Auth session (refreshed on expiry), then calls /api/v1/knowledge. Nothing is stored; every answer is live.
Things the API does that you should know
Search is by meaning. Scores are relative; a top score around 0.4-0.5 can still be the right node, so check the alternatives.
Lineage follows dependencies, not containment. A single field's lineage is often just itself;
list_edgesshows which table HAS it.Context search doesn't filter by text yet.
search_semantic_contextsfilters by node oris_global; find statements by meaning withsearch_nodes.Unknown ids behave differently per endpoint. The API's lineage returns an empty graph for an unknown id; this server resolves the node first, so you always get a clear error instead.
Deletes are idempotent. Deleting an unknown id succeeds without effect.
Some sites accept only graph-wide context. Creating a node-attached context can fail with
node_semantic_context_disabled("node-scoped context is managed by Tableau and arrives through ingestion"); BiztoryPulse does this. Useis_global=trueand name the field in the statement.import_from_ossiefalls back to that automatically.The API is rate-limited. Crawling a large graph node by node hits HTTP 429; the server retries with back-off, but prefer
lineageandimpact_analysisover manyget_nodecalls.
Security
Writes are limited to semantic contexts, take exact ids, are validated before sending, and are annotated so your client can ask first. A Viewer or Explorer PAT makes the server read-only in practice.
Local and stdio-only. No inbound network port is opened.
Secrets from env only. Never tool arguments, never logged, never returned.
Credentials go only to your Tableau host. HTTPS required, certificates verified, redirects refused.
No injection through ids. Node and context ids are encoded as one path segment;
graph_idis checked against Tableau's pattern before it is sent. Both parsers of untrusted input are fuzzed in CI.YAML is parsed safely. Ossie documents go through
yaml.safe_load(no tags, no code), with a 5 MB cap;validate_ossieandossie_guidenever contact Tableau.Verifiable releases. Every GitHub release carries Sigstore signatures and a CycloneDX SBOM, and PyPI uploads use Trusted Publishing.
Pin a version in production:
uvx biztory-tableau-knowledge-mcp==0.3.0.
See SECURITY.md for the threat model, data handling, disclosure policy and how to verify a release.
Troubleshooting
Symptom | Fix |
Server doesn't appear | Fully quit and relaunch the client; check the config path and JSON validity. |
| Install |
Sign-in fails (401, | The PAT is invalid or expired (15 days unused). Create a new one and check |
| The site doesn't have Tableau Knowledge; a Tableau Cloud Manager admin must enable it. |
| The site has no primary graph: pass a |
"Semantic search is unavailable" | The graph has no embedder. Use exact ids ( |
| Writing semantic contexts needs the Creator role. |
HTTP 429 after retries | You hit Tableau's rate limit; wait a minute and use fewer, broader calls. |
Inspect the server directly with the MCP Inspector:
npx @modelcontextprotocol/inspector uvx biztory-tableau-knowledge-mcpDevelopment
git clone https://github.com/biztory/biztory-tableau-knowledge-mcp && cd biztory-tableau-knowledge-mcp
uv sync --all-extras
uv run biztory-tableau-knowledge-mcp # run from source (needs the env vars above)
uv run pytest --cov=biztory_tableau_knowledge_mcp # tests + coverage (offline; no Tableau needed)
uv run ruff check . && uv run ruff format --check . && uv run mypyTool tests run through the real client against an in-process fake of the Knowledge API (tests/conftest.py), so URL building, id encoding and error mapping are all exercised. Live tests are opt-in: TABLEAU_LIVE=1 runs the read-only ones; TABLEAU_LIVE_WRITE=1 adds a round trip that creates, updates and deletes one temporary context it made itself.
The same gates run in CI (Linux/macOS/Windows, Python 3.10 to 3.13): ruff check, ruff format --check, mypy --strict, and pytest with a coverage floor. CodeQL scans every push, the OpenSSF Scorecard runs weekly, and a fuzzing job (fuzz/) attacks the untrusted-input parsers. The package ships a PEP 561 py.typed marker.
Contributions welcome: see CONTRIBUTING.md and the Code of Conduct.
Roadmap
Export to and import from Apache Ossie (formerly OSI)
Wrap the Ossie converters (Snowflake, dbt, Power BI, Databricks) as tools once they are published on PyPI
Ossie relationships from Tableau join keys, when the Knowledge API exposes them
A demo recording in this README
Optional per-session caching of
server_infoand resolved nodes
Ideas and votes welcome in Discussions.
License
MIT © Biztory. Sister project: tableau-graphql-mcp for lineage over the Tableau Metadata API.
Available Tools
17 toolscheck_business_preferencesCheck Business PreferencesARead-only
Check a Tableau Business Preferences file (the "# rule" lines Tableau's agent reads before it
answers) so every line is one the agent will actually follow. Call it with no text first to
get the rulebook: format, limits, wording rules, workbook preparation and how to test.
Checks: the "# " line format (a slip makes Tableau silently ignore the line), the limits (Tableau
Cloud: 50 rules and 8,000 characters per dashboard; Tableau Next: 30,000 per semantic model),
headers, duplicates, contradictions, thresholds without "use only this value", formatting rules
that would leak into queries, conversational lines, absences that can be over-read, ambiguous
ordering and averages, and missing baseline rules (query formatting, failure handling).
`target` (a dashboard, sheet, workbook or data source: id or description) also checks every
[Field] and "Field" the file names against the captions the agent will see in Tableau Knowledge,
with "did you mean" suggestions, and flags workbook problems (duplicate, generic or helper field
names). `product` is "cloud" or "next". Returns `ok` (no errors), `issues` by line, and stats.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| target | No | ||
| product | No | cloud | |
| graph_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, non-destructive, open-world profile, and the description adds substantial context beyond them: concrete limits (50 rules / 8,000 chars on Cloud, 30,000 on Next), the failure mode where a malformed line is silently ignored, and the return shape (`ok`, `issues` by line, stats). It never contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the first-call instruction are front-loaded, and the check inventory is dense rather than padded. The long enumerated "Checks:" sentence is justified by the tool's breadth but is heavy to parse in one pass.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a complex validator: it explains what is checked, the per-product limits, the optional target-based field validation, and what comes back, and an output schema exists so return details are partly redundant anyway. The unexplained `graph_id` is the one gap an agent could stumble on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the load, and it does for three of four params: `text` as the rule file content, `target` as a dashboard/sheet/workbook/data source id or description that triggers field-caption validation with "did you mean" hints, and `product` as "cloud" or "next" with different limits. `graph_id` is never mentioned, leaving one parameter undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource: validating a Tableau Business Preferences file of "# rule" lines so the agent actually follows each one. It also names the domain objects it inspects (rules, headers, thresholds, [Field] references) and is clearly distinct from the graph/lineage siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes the first call ("Call it with no `text` first to get the rulebook") and explains what `target` and `product` add on subsequent calls. It gives strong in-workflow guidance but does not state when not to use it or point to any alternative, which is less critical here since no sibling overlaps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_semantic_contextAdd semantic contextA
WRITE: attach business context (one or more statements, 5-1000 characters each) to the knowledge graph, e.g. "Net Sales excludes returns and is reported in EUR."
Set exactly ONE of: `target_node_id` (an exact node id from search_nodes/get_node; the
context then DESCRIBES that node) or `is_global=true` (applies to the whole graph).
CONNECTION, SITE, SCHEMA and semantic-context nodes can't be targets. Some sites accept only
graph-wide context through the API (error node_semantic_context_disabled): then use
is_global=true and name the field or data source in each statement. `name` is optional
(derived when omitted). Needs the Creator role. Returns the new context, with its id.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| graph_id | No | ||
| is_global | No | ||
| statements | Yes | ||
| target_node_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (not read-only, non-idempotent, non-destructive), and the description adds what they cannot: the Creator role requirement, the statement length bounds (5-1000 chars), the target-node type restrictions, the specific API error and its workaround, and the return shape ("Returns the new context, with its id"). No contradiction with the declared hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the WRITE marker, then the mutual-exclusion rule, then the edge cases and permission note — every sentence carries information. The third block packs target restrictions, an error code, and a workaround into one dense passage, which slightly hurts scanability but not correctness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be detailed, yet the description still notes the returned id. The one genuine hole is graph_id: with is_global and target_node_id both explained, an agent has no idea when graph_id is required or how it interacts with the other two.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it does for four of five parameters: statements (with size bounds and an example), target_node_id (with sourcing guidance from search_nodes/get_node), is_global (whole-graph scope), and name (optional, auto-derived). graph_id is never mentioned, leaving one parameter with no explanation anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with an explicit verb+resource+mode marker ("WRITE: attach business context ... to the knowledge graph") and gives a concrete example statement, so the effect is unambiguous. It is clearly distinguishable from its update_semantic_context / delete_semantic_context / search_semantic_contexts siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the exclusivity rule outright ("Set exactly ONE of: target_node_id ... or is_global=true"), enumerates the node types that cannot be targets, and provides a concrete fallback path when the API rejects site-scoped context (error node_semantic_context_disabled). This is explicit when/when-not guidance with an error-driven alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_semantic_contextDelete semantic contextADestructiveIdempotent
WRITE: delete a user-managed semantic context and its statements. Only semantic contexts created through Tableau Knowledge can be deleted; ids of other nodes are ignored, and Tableau-managed (SEMANTIC_CONTEXT_EXTERNAL) contexts are refused.
Returns what was deleted (name and statements, so it can be recreated if needed). Deleting an
id that doesn't exist succeeds without effect. Needs the Creator role.
| Name | Required | Description | Default |
|---|---|---|---|
| ctx_id | Yes | ||
| graph_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: requires the Creator role, ignores non-semantic node ids, refuses Tableau-managed contexts, succeeds without effect for nonexistent ids, and returns deleted name/statements for possible recreation. These details are consistent with destructiveHint=true, idempotentHint=true, and readOnlyHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with 'WRITE', then moves efficiently through eligibility, return behavior, edge cases, and authorization. Every sentence adds operational value with no padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive write tool, the description supplies the critical safety, authorization, eligibility, and idempotency context, while annotations and an output schema cover safety signals and return shape. The remaining gap is parameter-level detail, especially graph_id, which the schema also lacks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description does not explain the parameters. It refers generically to 'ids' and deleting an 'id', but never maps behavior to ctx_id or clarifies the optional graph_id at all, leaving both parameters semantically undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific write action and resource: delete a user-managed semantic context and its statements. It also scopes the operation by distinguishing user-created Tableau Knowledge contexts from Tableau-managed and non-context node ids, so an agent can identify the correct operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when/when-not guidance: only contexts created through Tableau Knowledge can be deleted, other node ids are ignored, and Tableau-managed SEMANTIC_CONTEXT_EXTERNAL contexts are refused. It does not name sibling alternatives such as update_semantic_context, but the eligibility rules are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_to_ossieExport to OssieARead-only
Export a published data source's semantic model to Apache Ossie (formerly OSI) YAML, the
vendor-neutral format that Snowflake, dbt, Power BI, Databricks, Tableau Next and other tools
convert from. Returns ossie (the YAML text, to save as file_name), summary, validation
and losses (what could not be carried and what to fix by hand).
`datasource` is a PDS id (from list_sources) or a description of it. Logical tables become
datasets, fields become fields, row-level calcs become fields and aggregate calcs become
metrics; every calc keeps its Tableau formula and gains portable SQL when the translation is
exact. Semantic-context statements become ai_context. `default_aggregation_metrics` also turns
each measure's Tableau default aggregation into a metric (total_sales = SUM(sales)).
Always read `losses`: Tableau Knowledge has no physical table paths or join keys, so `source`
and `relationships` need filling in before the model is used elsewhere. See ossie_guide.
| Name | Required | Description | Default |
|---|---|---|---|
| graph_id | No | ||
| datasource | Yes | ||
| include_hidden | No | ||
| default_aggregation_metrics | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, non-destructive, open-world), and the description adds real behavioral context: exactly how tables/fields/calcs map to Ossie constructs, when portable SQL is emitted, and the caveat that Tableau Knowledge carries no physical table paths or join keys so `source`/`relationships` need manual completion. It does not state size limits or performance characteristics, but the transformation contract is well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and return shape are front-loaded in the first sentence, followed by mapping details and warnings in descending priority. Dense but nearly every clause carries decision-relevant information; the parenthetical examples aid rather than pad.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return-value recap is bonus rather than necessary, and the loss/precondition warnings are strong. However, for a 4-parameter tool with zero schema description coverage, the silence on `graph_id` and especially `include_hidden` (which changes what is exported) is a meaningful gap in a description that otherwise sets a high bar.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains `datasource` (PDS id or a description of it) and `default_aggregation_metrics` (turn each measure's default aggregation into a metric), but leaves `graph_id` and `include_hidden` entirely undocumented, leaving half the parameters opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource—export a published data source's semantic model to Apache Ossie YAML—and defines the target format in vendor-neutral terms. The export direction cleanly distinguishes it from import_from_ossie, validate_ossie, and ossie_guide without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Says where the `datasource` id comes from (list_sources) and points to ossie_guide for background, and instructs the agent to always read `losses` before using the output. It lacks an explicit statement of when to prefer validate_ossie or import_from_ossie instead, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_nodeGet nodeARead-only
Get one node with its properties, its semantic statements (the business context attached
to it), and the child nodes it points to (connected_nodes, each with the edge type).
`node` is a node id, or a plain-language description that is resolved by semantic search
(the response then includes `resolution` with the match score and alternatives). Set
`include_children` false to skip `connected_nodes` on large containers.
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | ||
| graph_id | No | ||
| include_children | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a read-only, non-destructive, open-world operation. The description adds meaningful behavior beyond that: plain-language node inputs trigger semantic resolution with match scores and alternatives, and include_children=false skips connected_nodes for large containers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the core purpose in the first sentence and parameter behavior clarified in the second paragraph. Every sentence adds useful information without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is sufficient for basic retrieval and explains the semantic-resolution behavior, but it leaves graph_id undocumented and does not clarify routing versus search_nodes. Given the 0% schema description coverage, those are meaningful gaps for an agent deciding how to scope or select the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains node (id or plain-language query with resolution details) and include_children (skips connected_nodes), but graph_id is completely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource, 'Get one node', and enumerates what is returned: properties, semantic statements, and connected_nodes with edge types. It is clear, but it does not explicitly distinguish this retrieval tool from the sibling search_nodes tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful conditional guidance for include_children=false on large containers and explains that node can be a plain-language query resolved by semantic search. However, it never states when to use get_node instead of search_nodes, list_edges, or other sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_healthGraph healthARead-only
Graph-health report: a 0-100 health_score, coverage metrics (e.g. how many nodes carry
semantic context), graph stats, and concrete improvement suggestions (each with severity,
recommended_action and the target node ids), grouped by category and topic.
`pds_id` scopes the report to one published data source's subtree. `severity` ("high",
"medium", "low"), `suggestion_type` and `limit` (default 20; a busy graph has hundreds) filter
only the suggestion lists; the score, metrics and `summary` totals always cover the full (or
PDS-scoped) graph.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| pds_id | No | ||
| graph_id | No | ||
| severity | No | ||
| suggestion_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond the readOnly/non-destructive annotations: it defines the 0-100 score, explains that filters apply only to suggestion lists while score/metrics cover the full graph, and notes the default limit against a busy graph with hundreds of suggestions. These are non-obvious semantics that prevent misinterpretation of results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight paragraphs, front-loaded with what the tool returns and followed by scoping/filter semantics. Every sentence adds distinct information; nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is thorough about output structure and filter behavior, and the presence of an output schema reduces the need to explain return values further. The missing explanation of graph_id and its relationship to pds_id is the only notable gap for a five-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries the full burden and explains four of five parameters: pds_id scoping, severity allowed values, suggestion_type filtering, and limit default/scale. graph_id is completely undocumented, leaving one parameter's purpose and interaction with pds_id undefined.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific report resource and enumerates its contents (health_score, coverage metrics, graph stats, suggestions), making it unmistakable what the tool returns. No sibling tool produces a health report, so the distinction is inherent even without an explicit comparison.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The report context is clear enough that an agent knows to use this tool when assessing graph health, and the second paragraph gives explicit guidance on how scoping and filtering work. It stops short of naming alternatives or stating when not to use it, but for a unique health-report endpoint no alternative exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
impact_analysisImpact analysisARead-only
What breaks if this changes: every asset that depends on the node, directly OR transitively (up to 10 steps, following DEPENDS_ON), e.g. the calcs, sheets, dashboards and workbooks downstream of a column. The node itself is not included.
`node` is a node id or a plain-language description. Returns `total`, `counts_by_type`, and
`affected_assets` sorted by type then name.
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | ||
| graph_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/non-destructive, so the bar is lower, and the description adds real value beyond them: traversal edge type (DEPENDS_ON), a depth cap of 10 steps, and the fact that the queried node is excluded from results. It does not say what happens when the depth cap truncates a larger blast radius, which is the one behavioral detail an agent would want.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short blocks: the purpose/scope lead, the input note, then the return keys. Every sentence carries information (scope, depth limit, edge type, self-exclusion, return shape) with no filler, and the highest-value content is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the brief mention of `total`, `counts_by_type`, and sorted `affected_assets` is sufficient rather than redundant. For a two-parameter read tool with annotations, the only real omission is the undefined `graph_id` and truncation behavior at the 10-step limit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It does well for `node` (accepts a node id OR a plain-language description, a non-obvious flexibility), but `graph_id` is never mentioned at all, leaving the second parameter entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a concrete verb-in-context question ('What breaks if this changes') and precisely defines the resource: every asset depending on the node, direct or transitive, up to 10 steps along DEPENDS_ON. The examples (calcs, sheets, dashboards, workbooks downstream of a column) and the explicit exclusion of the node itself leave no ambiguity about what the tool returns versus a generic traversal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'what breaks if this changes' framing gives a clear use context, and the DEPENDS_ON/10-step scope implies when a broader traversal (e.g. the `lineage` sibling) would be the alternative. However, it never names an alternative or states a when-not-to-use condition, so the agent must infer the boundary with `lineage` itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_from_ossieImport from OssieADestructiveIdempotent
Bring the business meaning of an Apache Ossie (formerly OSI) model into Tableau Knowledge
as semantic contexts. WRITES only when apply is true; by default it returns the PLAN.
`document` is the model as YAML or JSON text. Elements are matched to nodes of one published
data source: models exported by export_to_ossie map back by their stored ids; other models
need `target_datasource_id` (an exact PDS id from list_sources) and match by name. Each matched
node gets one context named `ossie:<model>` holding its description, ai_context instructions,
synonyms ("Also known as: ..."), example questions, metric definition (`include_definitions`)
and relationships. Re-importing updates those contexts instead of duplicating them.
`scope`: "auto" (default) attaches contexts to nodes and, on sites that accept only graph-wide
context through the API (error node_semantic_context_disabled), writes the plan's
`global_fallback` instead: one global `ossie:<model>` context whose statements are prefixed
with what they describe. "node" never falls back; "global" plans the global context directly.
Workflow: call without `apply`, show the user the operations (create/update/unchanged) and
`unmatched` list, then call again with `apply=true` once they agree. Needs the Creator role.
| Name | Required | Description | Default |
|---|---|---|---|
| apply | No | ||
| scope | No | auto | |
| document | Yes | ||
| graph_id | No | ||
| model_name | No | ||
| include_definitions | No | ||
| target_datasource_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: dry-run default, the `node_semantic_context_disabled` fallback path, and explicit confirmation that re-import updates rather than duplicates contexts (supporting idempotentHint). It does not spell out what happens to existing context statements that the new model no longer contains — a gap for a tool flagged destructiveHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and the read/write gate before the detail, and each paragraph maps to a decision the agent must make. It is on the long side and the `scope` sentence is dense, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, destructive, open-world import with an output schema, the description covers the mutation gate, matching strategy, fallback behavior, permissions, and the human-approval loop. Return-value detail can be deferred to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage the description carries the load, and it explains `document` (YAML or JSON text), `apply` (write gate), `scope` with all three values and their fallback behavior, `target_datasource_id` (exact PDS id from list_sources), and `include_definitions`; `model_name` is only implicitly covered via the `ossie:<model>` naming and `graph_id` is never mentioned.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: importing an Apache Ossie model's business meaning into Tableau Knowledge as semantic contexts. The inverse relationship to `export_to_ossie` and the contrast with `validate_ossie`/`ossie_guide` are clear enough that an agent can pick this tool without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit two-step workflow (call dry to get the PLAN, show create/update/unchanged and `unmatched`, then re-call with `apply=true` after user agreement), plus the prerequisite (Creator role) and the conditional requirement for `target_datasource_id` when the model wasn't exported by `export_to_ossie`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lineageLineageARead-only
The lineage neighborhood of a node: every node reachable within 10 steps, upstream AND downstream, along lineage/dependency edges (LINEAGE, DEPENDS_ON), e.g. a data source and the workbooks built on it. Answers "where does this come from?" and "what uses it?".
Containment (a table HAS a field, a workbook CONTAINS a sheet) is not followed, so a single
field often returns only itself; use list_edges or get_node to see what contains it.
`node` is a node id or a plain-language description. Returns the anchor node, `nodes`,
`edges` (source_id -> target_id, with type), and counts by node and edge type. For "what
breaks if this changes?", impact_analysis is more direct.
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | ||
| graph_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/open-world safety, and the description adds genuinely new behavioral detail: a hard 10-step traversal cap, which edge types are followed, which are not (containment), and the resulting edge case for single fields. It also sketches the return payload (anchor, nodes, edges with source_id -> target_id and type, counts), which goes beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then edge-type scope, then containment caveat, then return shape and alternative. Every sentence adds information; the example ('a data source and the workbooks built on it') and the two quoted questions efficiently anchor usage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values need not be fully explained, and the description still summarizes them. Traversal semantics, limits, and alternatives are all covered. The main gap is the undocumented `graph_id` parameter and whether it scopes the traversal to a particular graph.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden. It clarifies that `node` accepts either a node id or a plain-language description, which is valuable, but the second parameter `graph_id` (nullable, default null) is never mentioned, leaving half the parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and traversal scope ('lineage neighborhood of a node: every node reachable within 10 steps, upstream AND downstream, along lineage/dependency edges') and names the edge types followed. This is clearly distinguishable from siblings like impact_analysis, list_edges, and get_node.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the questions it answers ('where does this come from?', 'what uses it?'), states the exclusion (containment edges not followed, with the consequence that a single field returns only itself), and redirects to list_edges/get_node for containment and to impact_analysis for 'what breaks if this changes?'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_edgesList edgesARead-only
List the edges around one node, each with its direction (outgoing/incoming) and the node
on the other end. One hop only; use lineage for the wider neighborhood.
`node` is a node id or a plain-language description. `edge_type` narrows to one of: CONTAINS,
HAS, JOINS, DEPENDS_ON, LINEAGE, SEMANTIC_EQUIV, DESCRIBES. `direction` is "outgoing" or
"incoming"; omit for both.
| Name | Required | Description | Default |
|---|---|---|---|
| node | Yes | ||
| graph_id | No | ||
| direction | No | ||
| edge_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/non-destructive, so the safety profile is covered; the description adds genuinely new behavior — one-hop boundary, direction semantics, and default "omit for both." It does not cover edge cases such as an unresolvable or ambiguous plain-language node, which matters for a mutation-free but fuzzy lookup.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope lead, then a compact parameter paragraph — no filler. Every clause either bounds the behavior (one hop) or routes to a sibling (lineage), and the edge-type enumeration is terse yet complete.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers scope, the sibling alternative, and three of four parameters. The `graph_id` parameter is never mentioned, so an agent omitting it must infer that a default graph applies.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and no enums are declared, so the description carries the burden — and it does: it explains `node` accepts an id or plain-language description, enumerates all seven valid `edge_type` values, and gives the two `direction` values plus the omit-for-both default. Only `graph_id` is left undocumented, which keeps it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb and resource ("List the edges around one node") with the return shape and scope stated up front ("each with its direction ... and the node on the other end"). The closing clause "One hop only; use lineage for the wider neighborhood" distinguishes it from the `lineage` sibling without requiring a schema read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (`lineage`) and the condition that selects it (wider neighborhood), which is the key routing decision for this tool. It gives no guidance on prerequisites or when neither tool applies (e.g. vs. `search_nodes`/`get_node`), so it is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sourcesList sourcesARead-only
List the published data sources and workbooks connected to the knowledge graph, i.e. what
the graph has been built from. node_type "PDS" or "WORKBOOK" narrows it; omit for both.
| Name | Required | Description | Default |
|---|---|---|---|
| graph_id | No | ||
| node_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile needs no restating. The description adds useful framing that the results are the provenance of the graph, but says nothing about ordering, volume, or what an empty graph returns. With annotations carrying the risk profile, this is adequate but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, and the core purpose is front-loaded with the filtering detail after it. The backticked literal values make the parameter guidance scannable at a glance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, annotations cover safety, and an output schema exists so return values need no explanation. The one real gap is graph_id — an agent cannot tell from the description what happens if it is omitted or whether it is required in practice.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden, and it does explain node_type's accepted values ("PDS" or "WORKBOOK") and the omitted-means-both default — information the schema lacks since no enum is declared. However, graph_id is never mentioned, leaving half the parameters undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ("List the published data sources and workbooks") and adds a scoping gloss ("what the graph has been built from") that tells an agent this is inventory, not traversal. It does not name any sibling such as lineage or search_nodes, so the differentiation from the closest alternatives is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The only guidance is parameter-level: use node_type to narrow, omit for both. There is no statement of when to reach for list_sources versus lineage, search_nodes, or graph_health, even though those siblings sit adjacent to the same graph-inventory concept. Usage is implied by the phrasing rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ossie_guideOssie guideARead-only
Reference for Apache Ossie (formerly Open Semantic Interchange, OSI), the open standard for
semantic models: what it is and its versions, the object model and rules, expressions and
dialects, how Tableau maps onto it, relationships, ai_context, extensions, validation, the
converters for other platforms (with exact commands), and a porting playbook with pitfalls.
Read it before hand-editing a model or advising on a port. topic is one of: overview, model,
expressions, tableau, relationships, ai_context, extensions, validation, converters, porting;
omit it for everything.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context by explaining that `topic` selects a section and omitting it returns everything, though it does not describe the output format or size.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and ends with actionable topic/usage guidance. It is slightly repetitive because the covered topics are listed once in prose and again as the `topic` enum, but the repetition is helpful rather than wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema, annotations, and single optional parameter, the description provides everything an agent needs: what the tool is, when to use it, valid topic values, and default behavior. No important gap remains for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the schema has no enum, so the description carries the full burden. It compensates completely by enumerating every valid `topic` value and explicitly stating that omitting the parameter returns all topics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and scope: reference documentation for Apache Ossie semantic models, covering versions, object model, expressions, Tableau mapping, converters, and porting. It is clearly distinguishable from sibling operational tools such as export_to_ossie, validate_ossie, and import_from_ossie because it is explicitly a reference/read-before-editing guide.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear triggering condition: read it before hand-editing a model or advising on a port. It does not name explicit alternatives or when-not-to-use scenarios, but for a documentation tool the guidance is strong enough that an agent knows when to reach for it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_nodesSearch graph nodesARead-only
Find graph nodes by MEANING (semantic search), not exact name: "revenue" can match a
field named "Net Sales". Returns ranked matches with a 0-1 score; when a semantic statement
matched, it is shown under the node's semantic_statements.
- `node_type` narrows to one type: PDS (published data source), WORKBOOK, SHEET, DASHBOARD,
EMBEDDED_DATASOURCE, TABLE, FIELD, WAREHOUSE_TABLE, WAREHOUSE_COLUMN, CONNECTION, SCHEMA,
SITE, SEMANTIC_CONTEXT, SEMANTIC_CONTEXT_EXTERNAL.
- `scope_id` limits the search to one data source's subtree (a PDS node id plus its tables
and fields).
- `limit` 1-100 (default 10); `threshold` drops matches scoring below it (0-1).
Use the returned `id`s with get_node, list_edges, lineage and impact_analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| graph_id | No | ||
| scope_id | No | ||
| node_type | No | ||
| threshold | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the read-only, non-destructive, open-world profile, so the description is not burdened with safety disclosure. It adds genuine value beyond that: ranked 0-1 scores, the semantic_statements field when a statement matched, and the threshold/limit filtering behavior. What remains unstated is pagination beyond limit and any latency or cost characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core distinction (meaning, not exact name) before the reference detail. The bulleted parameter notes are dense and every sentence earns its place; nothing is padded or repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still usefully flags the score field and semantic_statements, which are the fields an agent will actually act on. Combined with the tool-selection guidance and chaining advice, this is nearly complete for a search tool, with graph_id being the only meaningful omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load, and it does for four of six parameters: node_type (with the full valid value list), scope_id (with the PDS subtree semantics), limit range and default, and threshold semantics. query is self-evident, but graph_id is never mentioned in either the description or the schema, leaving one parameter fully opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find graph nodes') and immediately disambiguates the mechanism: semantic matching rather than exact-name lookup, with a concrete example ('revenue' matching 'Net Sales'). An agent can distinguish this from sibling tools like get_node or search_semantic_contexts without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains when to use it (finding nodes by meaning) and names the downstream siblings to chain into (get_node, list_edges, lineage, impact_analysis). It stops short of explicitly naming an alternative for exact-name lookup or stating when not to use this tool, so it is strong but not fully prescriptive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_semantic_contextsFind semantic contextsARead-only
List semantic contexts: the business statements (definitions, rules, caveats) attached to the graph. Includes user-managed (SEMANTIC_CONTEXT, editable) and Tableau-managed (SEMANTIC_CONTEXT_EXTERNAL, read-only) contexts.
- With `node` (an id or a description): only the contexts attached to that node.
- Without `node`: every context on the graph; `is_global` true = only graph-wide contexts,
false = only node-attached ones, omitted = both.
The API doesn't filter by text yet; to find statements by meaning, use search_nodes.
| Name | Required | Description | Default |
|---|---|---|---|
| node | No | ||
| graph_id | No | ||
| is_global | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=true), and the description adds real context on top: it distinguishes editable user-managed contexts from read-only Tableau-managed ones, and discloses an API limitation ('doesn't filter by text yet'). It stops short of describing result ordering or volume, but with an output schema present that is a minor omission.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded definition, then two scannable bullets for the two filtering modes, then the alternative-tool note. No filler sentences; every clause conveys a distinct rule the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-optional-parameter list tool with annotations and an output schema, this is nearly complete — filtering behavior and result mutability are both covered. The only gap is the unexplained `graph_id` parameter, which matters for an agent operating across multiple graphs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden. It fully explains `node` (accepts an id or a description) and `is_global` (true/false/omitted semantics), but `graph_id` is never mentioned in the description or the schema, leaving one of three parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List semantic contexts') and immediately defines what a semantic context actually is (definitions, rules, caveats attached to the graph). The closing line explicitly routes text-meaning lookups to the sibling search_nodes, so an agent can separate it from the other search tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use branches: with `node` scopes to that node's contexts, without `node` returns everything with `is_global` narrowing to graph-wide vs node-attached. It also names the alternative (search_nodes) for the case this tool cannot serve, which is exactly the exclusion guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_infoConnection and graphsARead-only
Report the connected Tableau site and its knowledge graphs: server URL, site, product
version, auth method, whether Tableau Knowledge is available, and every graph (id, name,
status, is_primary). Good first call: it confirms the connection and gives the graph ids the
other tools accept as graph_id (omit graph_id to use the primary graph).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=true, so the safety profile is covered. The description adds useful context that this is a connection-confirmation step and that graph_id defaults to the primary graph, but says nothing about latency, permissions required, or failure behavior if the connection is broken.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then the field list, then the actionable 'Good first call' guidance in priority order. Every clause carries information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters and an output schema already covering the return shape, the description only needs to say what the call is for and why an agent should make it. Both are answered, plus the graph_id handoff detail that makes downstream calls correct.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies; the schema cannot be missing anything. The graph_id note refers to sibling tools' arguments rather than this tool's own input, so it adds cross-tool clarity but no local parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('Report the connected Tableau site and its knowledge graphs') and enumerates the returned fields (server URL, site, product version, auth method, availability flag, and per-graph id/name/status/is_primary). An agent can distinguish it from siblings like graph_health or search_nodes without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames itself as a 'Good first call' and explains how its output feeds other tools ('gives the graph ids the other tools accept as graph_id'), including the default when graph_id is omitted. No when-not conditions or named alternative diagnostics (e.g., graph_health) are given, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_semantic_contextUpdate semantic contextADestructiveIdempotent
WRITE: change a user-managed semantic context (ctx_id, e.g. "semctx:"). Only what
you pass changes.
- `statements` REPLACES the whole stored set (include every statement you want to keep).
- `name` renames it.
- `attach_to` (an exact node id) re-attaches it to that node; `make_global=true` detaches it
and makes it graph-wide. Not both.
Tableau-managed (SEMANTIC_CONTEXT_EXTERNAL) contexts can't be changed. Needs the Creator role.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| ctx_id | Yes | ||
| graph_id | No | ||
| attach_to | No | ||
| statements | No | ||
| make_global | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=true, and the description adds the crucial nuance that `statements` REPLACES the entire stored set rather than appending — the single most important behavioral fact for this tool. It also discloses the auth prerequisite (Creator role) and the hard exclusion on external contexts, which annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the WRITE marker, then a bulleted per-parameter breakdown that scans quickly. Every line carries a distinct constraint or side effect; nothing is redundant padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, idempotent mutation with an output schema (so return values need no explanation), the description covers side effects, permissions, and invalid targets well. The only real gap is the unexplained `graph_id` parameter, which an agent must guess at or read from the schema title alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden and mostly delivers: it explains `name` (rename), `statements` (full replacement), `attach_to` (exact node id), `make_global` (detach + graph-wide), and the mutual exclusion between the last two. `graph_id` is never mentioned, leaving one of six parameters undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with an explicit verb and resource ("WRITE: change a user-managed semantic context") and names the identifier form (`ctx_id`, e.g. "semctx:<uuid>"), so it is immediately distinguishable from create_semantic_context and delete_semantic_context siblings. The qualifier "user-managed" further scopes what kind of object this acts on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong when/when-not guidance: Tableau-managed (SEMANTIC_CONTEXT_EXTERNAL) contexts can't be changed, the Creator role is required, and attach_to vs make_global are mutually exclusive ("Not both"). It never names a sibling alternative for the excluded cases, so it stops just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_ossieValidate Ossie modelARead-only
Validate an Apache Ossie (formerly OSI) model, given as YAML or JSON text, against the
official JSON Schema (0.2.0.dev0, bundled) and the spec's semantic rules: duplicate names,
keys and relationship columns that are not declared fields, unknown datasets, qualified names
in dataset-scoped metrics. 0.1.1 documents (semantic_model: list) are converted first; pass
model_name when one holds several models. Runs locally: nothing is sent to Tableau.
| Name | Required | Description | Default |
|---|---|---|---|
| document | Yes | ||
| model_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the description needn't restate safety, but it adds real context: the bundled schema version, automatic 0.1.1→0.2.0 conversion, and the explicit note that execution is local with nothing sent to Tableau. The enumerated semantic checks further disclose what failure modes to expect. It stops short of describing error/report shape, but an output schema exists for that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with verb and resource, then the validation targets, then the conversion caveat, then the locality note — a sensible ordering with little waste. The mid-sentence list of semantic rules is dense but each item is informative rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be explained, and both parameters plus the version-conversion edge case are covered. For a two-parameter read-only validator, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden and largely does: `document` is identified as YAML or JSON text, and `model_name` is explained as the disambiguator for 0.1.1 documents holding several models. It doesn't clarify `model_name` behavior for 0.2.0 documents or what happens when it's omitted/ambiguous, which is the remaining gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (validate) and resource (Apache Ossie model given as YAML/JSON text), plus the exact standard it checks against (bundled JSON Schema 0.2.0.dev0 and spec semantic rules). This is clearly distinguishable from the sibling import/export tools, which move data rather than check it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the agent can infer this is a pre-flight check for Ossie documents, and the description gives a conditional rule for `model_name` on multi-model 0.1.1 documents. However, it never names an alternative or says when not to use it (e.g., versus import_from_ossie, which presumably also parses documents), leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.3.0- Added
check_business_preferences - Added
export_to_ossie - Added
import_from_ossie - Added
ossie_guide - Added
validate_ossie
12 tool updates
v0.1.0- First observed
create_semantic_context - First observed
delete_semantic_context - First observed
get_node - First observed
graph_health - First observed
impact_analysis - First observed
lineage - First observed
list_edges - First observed
list_sources - First observed
search_nodes - First observed
search_semantic_contexts - First observed
server_info - First observed
update_semantic_context
TDQS
Scored across 17 tools
Most tools target clearly distinct actions: graph traversal (lineage, impact_analysis, list_edges, get_node), semantic-context CRUD, and the Ossie pipeline are well separated by descriptions. The only mild overlap is between get_node's connected_nodes, list_edges, and lineage when inspecting a node's neighborhood, but the descriptions explicitly guide which to use for what (one-hop vs. wide neighborhood vs. impact).
Consistent snake_case, but mixing verb_noun tools (search_nodes, get_node, create_semantic_context, validate_ossie) with noun-only names (lineage, impact_analysis, graph_health, server_info, ossie_guide). Readable, but the pattern is not predictable enough to reliably infer a tool's action from its name.
17 tools sits at the heavy end of the 16-25 borderline band. The set covers three substantial areas (graph exploration, semantic-context CRUD, Ossie import/export/validate, plus preference checking), which justifies some breadth, but a few tools could plausibly be consolidated.
Semantic contexts have full create/update/delete coverage and are discoverable via search_semantic_contexts; the graph side has search, get, edges, lineage, impact, health and sources; the Ossie side has export, validate and import. Minor gaps: no direct single-context read by id and no explicit enumeration of nodes without a semantic search term.
Maintenance
Related MCP Connectors
Query your org's data in natural language — read-only MCP access to SQL, NoSQL, files & warehouses.
Query your warehouse or a CSV with Claude/ChatGPT over MCP, governed by table-level ACL + audit.
Governed data discovery, exact queries, decisions, simulations, and runtime utilities over MCP.
Query and audit AppSheet apps in natural language via Knotrik's pre-scanned definitions.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables querying Tableau lineage through the Metadata API via MCP, supporting impact analysis, where-used lookups, and content search. Provides read-only tools for answering natural-language questions about workbooks, datasources, fields, and dependencies.740 PyPI1MIT
- FlicenseBqualityBmaintenanceA production-grade MCP server that exposes Tableau Server/Cloud as a BI platform, enabling project, workbook, data source, user, group, job, lineage, and export operations via natural language, with role-based permissions and token optimization.69-
- AlicenseNot gradedqualityAmaintenanceEnables querying a Neo4j knowledge graph built from Git repositories and relational database schemas via MCP, with tools for schema inspection, Cypher queries, and searching code and database entities.MIT
- FlicenseNot gradedqualityCmaintenanceMCP server that wraps the Tableau REST API and VizQL Data Service to expose tools for listing workbooks/datasources and querying datasources, enabling LLM agents to interact with Tableau Server/Cloud through natural language.-