Knowledge Graph for Education Global MCP is a curriculum-agnostic FastMCP server for exploring curriculum knowledge graphs from countries, states, and educational organizations. It provides one interface for discovering frameworks, searching academic standards, navigating curriculum hierarchies, retrieving provenance-aware resources, and assembling deterministic evidence for cross-framework comparison.
Claude Desktop acts as the reasoning and generation layer. The server remains read-only and deterministic: it loads accepted graph packages, validates and indexes them, returns source-grounded evidence, and does not call a server-side LLM.
Each curriculum is retained as an independent, immutable, and versioned graph package. A shared catalog and common MCP services make the packages searchable through one server without flattening them into a single source graph.
This preserves:
- exact framework, snapshot, and package identity;
- source terminology and local grade labels;
- provenance, rights, and validation evidence;
- tree and multi-parent DAG topology; and
- unresolved relationship statuses.
The current implementation focuses on Academic Standards graphs and is designed to remain configuration-driven rather than curriculum-specific.
The server exposes:
- 19 tools
- 1 fixed resource
- 14 resource templates
- 9 prompts
list_frameworksget_frameworksearch_standardsget_standardget_standard_contextsearch_learning_componentsget_learning_componentget_learning_component_contextget_learning_components_for_standardget_framework_statisticsget_capabilitiescompare_framework_evidenceget_learning_progressionget_standard_progressionssearch_learning_progressionstraverse_learning_progressionsget_learning_progression_pathsread_evidenceget_workflow_instructions
student_study_supportteacher_guide_draftstudent_handbook_sectionmultigrade_lesson_planlearning_progression_teaching_sequencelearning_progression_support_planlearning_progression_curriculum_reviewadministrator_alignment_reviewcross_framework_comparison
compare_framework_evidence exposes text matching through flat scalar fields
matchMode (tokens or exact_phrase) and matchOperator (all or any).
Do not send a nested match object to this tool. The adapter constructs the existing
typed internal text-match policy before calling the ordinary comparison service.
Text search uses exact normalized description tokens or contiguous normalized phrases.
It does not stem words or expand synonyms, so fraction and fractions are different
queries. For concept discovery, Claude should search the user's original wording first
and may then issue at most three separate conservative alternatives, such as a clear
singular/plural or retrieved local-terminology variant. Every alternative must preserve
the same framework, snapshot, grade, subject, statement-type, grouping, match, and limit
settings. Cross-framework alternatives must be applied symmetrically. Each call retains
its own bounds, scores, has_more value, and cursor; a zero-match result does not prove
curriculum absence. Once a relevant branch is found, bounded hierarchy context is
preferred over unlimited synonym generation.
Stored progression queries retrieve buildsTowards and relatesTo evidence in one
exact framework/snapshot. The three new prompts support teaching sequences, support
planning and curriculum review using standards, relationships, provenance and
supporting Learning Components. Grade arrays are entered as JSON arrays at the prompt
boundary. Stored edges are IDinsight-generated judgments, without publisher
endorsement; confidence is not a calibrated learner-success probability. Missing edges
do not prove absence of a pedagogical relationship. See the progression guide
and maintainer update process.
Install:
- uv
- Git
- Python 3.13 through
uv - Claude Desktop for local MCP use
None of this is needed to use a hosted deployment; see Connect to a hosted server.
The project requires Python >=3.13,<3.14.
Install the required Python version:
uv python install 3.13Node.js and npm are needed only when building an optional .mcpb distribution.
Clone the repository and enter its root:
git clone <repository-url>
cd KGForEdGlobalMCPCreate or update the locked backend environment:
uv --directory backend sync --locked --no-devThe application resolves the repository-level config/ and data/ directories from
its installed source layout. Optional KGFEGMCP_* environment variables can override
those paths, but are not required for ordinary repository-local commands.
To install development tooling as well:
uv --directory backend sync --locked --extra devRun the real server through a separate locked STDIO subprocess:
uv --directory backend run --locked --no-dev kgfegmcp-stdio-smokeThe smoke command:
- starts
python -m kgfegmcp.mcpb_server; - completes an MCP handshake;
- verifies the exact 13-tool, 1-resource, 12-template, and 7-prompt inventory; and
- confirms that the subprocess exits cleanly.
A successful run returns a JSON result with "status": "passed".
The server entry point can also be started directly:
uv --directory backend run --locked --no-dev \
python -m kgfegmcp.mcpb_serverThat command is not an interactive shell. It waits for an MCP client and reserves stdout for protocol traffic.
The documented local integration uses Claude Desktop's MCP configuration file. On
2026-10-08 a user connected Desktop on macOS to server 0.4.0 this way and through the
.mcpb bundle, with no failures observed; see
Use with Claude Desktop and claude.ai.
~/Library/Application Support/Claude/claude_desktop_config.json
Find the absolute paths required by Claude Desktop:
command -v uv
pwdAdd the following entry under the existing top-level mcpServers object. Replace
/absolute/path/to/uv and /absolute/path/to/repository with the values from your
machine. Preserve unrelated Claude Desktop settings already present in the file.
{
"mcpServers": {
"curriculum-knowledge-graph": {
"command": "/absolute/path/to/uv",
"args": [
"--directory",
"/absolute/path/to/repository/backend",
"run",
"--locked",
"--no-dev",
"python",
"-m",
"kgfegmcp.mcpb_server"
],
"env": {
"KGFEGMCP_CONFIG_ROOT": "/absolute/path/to/repository/config",
"KGFEGMCP_DATA_ROOT": "/absolute/path/to/repository/data",
"KGFEGMCP_ENV": "local",
"KGFEGMCP_GRAPH_PACKAGES_ROOT": "/absolute/path/to/repository/data/graph_packages",
"KGFEGMCP_INVALID_PACKAGE_POLICY": "fail",
"KGFEGMCP_LOG_LEVEL": "INFO",
"KGFEGMCP_PROFILE_ROOT": "/absolute/path/to/repository/config/profiles",
"KGFEGMCP_PROMPT_ROOT": "/absolute/path/to/repository/config/prompts",
"PATHS_PROJECT_DIR": "/absolute/path/to/repository"
}
}
}
}When the file already contains other keys, replace only the empty mcpServers object or
add the curriculum-knowledge-graph member to the existing object.
Validate the JSON:
jq empty "$HOME/Library/Application Support/Claude/claude_desktop_config.json"Fully quit and reopen Claude Desktop:
osascript -e 'quit app "Claude"'After restart, enable curriculum-knowledge-graph under Connectors in a new conversation.
A simple first request is:
Use the curriculum-knowledge-graph connector to list all available frameworks.
The same server can run as a hosted Streamable HTTP service. Clients then connect to a URL instead of starting a local process, and nothing is installed on the user's machine. The project's public deployment is at:
https://kg-for-ed-global-mcp.up.railway.app/mcp
In Claude, add a custom connector in the connector settings and enter that URL, leaving authentication empty. A user connected a claude.ai custom connector to this deployment, running 0.4.0, on 2026-10-08 with no failures observed. In Claude Code:
claude mcp add --transport http curriculum-knowledge-graph https://kg-for-ed-global-mcp.up.railway.app/mcpThe hosted service is built from the root Dockerfile, which bakes config/ and
data/graph_packages/ into the image and starts python -m kgfegmcp.http_server. The
MCP surface is identical to the local STDIO server. Build and verify it locally with:
docker build -t kgfegmcp-http:local .
docker run --rm --read-only -e PORT=8000 -p 8000:8000 kgfegmcp-http:local
uv --directory backend run --locked --no-dev kgfegmcp-http-smoke \
--url http://localhost:8000/mcpSee docs/operations/deployment.md for the hosting workflow, rollback, and the access
and rights posture of a public endpoint.
The repository can build a deterministic MCP Bundle containing the locked Python metadata, source package, profiles, prompt configurations, and accepted graph packages.
Install the official MCPB CLI:
npm install -g @anthropic-ai/mcpbBuild the bundle:
uv --directory backend run --locked --no-dev kgfegmcp-build-mcpbThe default output is:
dist/kgfegmcp-1.0.0.mcpb
Retain the exact staging directory for review:
rm -rf ./dist/kgfegmcp-stage
uv --directory backend run --locked --no-dev kgfegmcp-build-mcpb \
--stage-output ./dist/kgfegmcp-stageSmoke-test the staged runtime:
uv --directory backend run --locked --no-dev kgfegmcp-stdio-smoke \
--bundle-root ./dist/kgfegmcp-stageThe bundle does not contain a virtual environment or vendored dependencies. Its runtime
uses locked uv project metadata and starts the server with:
python -m kgfegmcp.mcpb_server
Claude Desktop custom-extension installation behavior may vary by client build. Manual
registration through claude_desktop_config.json is the documented local connection
method. A user installed and used the 0.4.0 bundle in Desktop on macOS on 2026-10-08
with no failures observed; other Desktop builds and operating systems are untested.
Show command help:
uv --directory backend run --locked --no-dev kgfegmcp-stdio-smoke --help
uv --directory backend run --locked --no-dev kgfegmcp-http-smoke --help
uv --directory backend run --locked --no-dev kgfegmcp-build-mcpb --help
uv --directory backend run --locked --no-dev kgfegmcp-build-manifest --help
uv --directory backend run --locked --no-dev kgfegmcp-validate-packages --help
uv --directory backend run --locked --no-dev kgfegmcp-verify-evidence-archive --helpA clone holds only the runtime graph packages. Rebuilding or accepting a package also needs the archived evidence, which is git-ignored; see Add or update a framework.
Confirm that:
commandis the absolute result ofcommand -v uv;- the repository and backend paths are absolute;
- the JSON passes
jq empty; - Claude Desktop was fully quit and reopened; and
- the repository STDIO smoke still passes.
Inspect Claude's logs on macOS:
find "$HOME/Library/Logs/Claude" \
-maxdepth 1 \
-type f \
-iname '*mcp*' \
-printAlways launch the server as a module:
python -m kgfegmcp.mcpb_server
Do not execute src/kgfegmcp/mcpb_server.py by filesystem path. Direct file execution
can cause the internal kgfegmcp.mcp package to shadow the external MCP SDK package.
STDIO stdout is reserved for MCP protocol messages. Application logging must remain on
stderr, and production code should not use uncontrolled print() calls.
AGENTS.mdsupplies project agent instructions;docs/architecture.mddescribes the maintained architecture.backend/README.mdcontains backend-specific operational notes.packaging/mcpb/README.mddescribes the MCP Bundle packaging workflow.
See LICENSE.