Skip to content

Content over MCP

A connector declares its content once, in its package, and serves it through the MCP primitives agents already use. Provisioning reads the same listings, so what an agent can call is exactly what the knowledge graph records.

What is served

register_connector_content(mcp, ConnectorContent(...)) registers:

Package path MCP primitive Artifact kind Record kind
skills/<name>/SKILL.md skill://<name>/SKILL.md resource skill Skill
prompts/<name>.json prompt <name> prompt McpPrompt
ontology/<file>.ttl ontology://<connector>/<file>.ttl resource Ontology
ontology/shapes/<file>.ttl shapes://<connector>/<file>.ttl resource ShapesGraph
connector_manifest.yml manifest://connector resource ConnectorManifest
the server's tools tools/list tool Tool

A prompt file that has no instructions.core_directive, or a declared manifest that does not exist, is an error when the server starts.

ConnectorContent also carries the publishing package version. A composition root that hosts declarative content from more than one package registers each provider explicitly, then calls provision_connector_content(provider, sink=...) once per provider. The SDK captures each provider through its own in-process MCP listing and imports it under that provider's connector identity; resources from two providers can therefore never collapse into one ConnectorPack head or receipt.

Content packs

build_content_pack(session, connector=..., kinds=...) reads every entry of the given kinds from one session, validates each, and returns a captured generated ConnectorPack archive. EG computes the canonical pack digest from that archive and the current catalog snapshot, so the SDK never carries a second digest implementation. Two entries with one URI, an unknown resource scheme, or a malformed body are rejected.

Ontology and shapes bodies enter the generated archive as the exact served UTF-8/LF bytes with text/turtle; connector packages must therefore publish canonical LF files. The SDK does not parse or reserialize identity-bearing Turtle. The generated archive builder supplies the section hashes, URI ordering, and mcp-server://<connector> server entry. EG alone binds those entries to the admitted catalog snapshot and canonical pack digest.

Pack facts are carried by EG's generated PackAnnotations: capability, modality, cost, latency, and contract-version declarations come from the exact eg.annotations key in MCP _meta (or skill front matter). Tools additionally carry all explicitly served MCP safety hints and the SDK compatibility fingerprint of their input/output contract. Conflicting declarations fail closed instead of silently choosing one.

Manifest, presets and fingerprints

A connector package carries three declarations of its sync contract:

File Loader
connector_manifest.yml load_manifest
connectors/mcp_source_presets.json load_tool_presets
connectors/tool_schema_fingerprints.json load_tool_schema_fingerprints

require_valid_connector_package(package_root) fails when they disagree: a sync entry that names a preset that does not exist, a mirrored field that differs, a fingerprint that does not match, or a preset the manifest does not declare. Fingerprints use the agent-connector-sdk:mcp-tool-contract-compat:v2 algorithm, which binds the canonical input and output schemas. Generate pins from the live tools/list response with connector-certify. The package loader fails closed on any other algorithm label.