Public Data
Only NTPU AI4X's official public data is provided.
This document explains how to start using AI4X MCP, connect an MCP client, query the center's public data, and understand the protocol, sources, security, and error behavior.
NTPU AI4X MCP is a public, read-only Model Context Protocol server that gives AI clients safe, source-attributed access to official NTPU AI4X information: center info, services, members, projects, documents, and events.
Only NTPU AI4X's official public data is provided.
MCP tools never modify data and never provide arbitrary command execution.
Every tool response carries provenance, source, and version information.
The public MCP endpoint can be connected to directly by any MCP-capable client.
Most users never need to send JSON-RPC by hand. Pick the MCP client you use and follow the steps below.
1
Choose an MCP client
Pick the tab below for the client you use.
2
Add AI4X MCP
Copy that client's configuration snippet and restart it if needed.
3
Ask your first question
Try: "Use AI4X MCP to look up the AI4X center's information."
Configure your client with the MCP endpoint URL below; no API key is required.
Add AI4X MCP to Claude Desktop's config file, then restart the app.
{
"mcpServers": {
"ai4x": {
"url": "https://ai4x.mcp.ntpu.ai/mcp"
}
}
}
Add the server with the Claude Code CLI, or edit .mcp.json directly.
claude mcp add --transport http ai4x https://ai4x.mcp.ntpu.ai/mcp
Add a custom connector pointing at the streamable-HTTP endpoint below.
MCP Server URL: https://ai4x.mcp.ntpu.ai/mcp
Authentication: None
Add an MCP server entry to your workspace or user settings.
{
"mcp": {
"servers": {
"ai4x": {
"type": "http",
"url": "https://ai4x.mcp.ntpu.ai/mcp"
}
}
}
}
No client at all? Talk to the endpoint directly with a JSON-RPC POST.
curl -X POST https://ai4x.mcp.ntpu.ai/mcp \
-H "content-type: application/json" \
-H "accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
You're connected once: you get real data back, the response includes a source, and no API key was needed.
A legacy-compatible JSON-RPC request against tools/list:
curl -X POST https://ai4x.mcp.ntpu.ai/mcp \
-H "content-type: application/json" \
-H "accept: application/json, text/event-stream" \
-d '{
"jsonrpc":"2.0",
"id":1,
"method":"tools/list",
"params":{}
}'
If the response contains result.tools, the MCP service is responding successfully for this compatibility request.
11 read-only tools grouped into 6 categories. Click a category to jump to it, or expand a tool below for its parameters and examples.
Query the AI4X center's basic information.
Search and look up service information.
Search the center's members.
Query research projects.
Query public documents.
Get event information.
get_center_info
Returns official center-level facts: name, mission, start date, and public website.
This tool takes no parameters.
Example request
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_center_info","arguments":{}}}
Example response (shape)
{ "center": { "nameZh": string, "nameEn": string|null, "mission": string|null, "officialStartDate": string|null, "website": string }, "provenance": Provenance }
search_services
Searches the public catalog of AI4X services by keyword, status, or type.
| Parameter | Type | Required | Description |
|---|---|---|---|
| keyword | string (1β100) | No | Free-text keyword filter |
| status | enum: active | inactive | planned | No | Filter by service status |
| serviceType | string (1β50) | No | Filter by service type |
| limit | integer (1β50) | No | Max results, default 10 |
Example request
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_services","arguments":{"keyword":"cloud","limit":5}}}
Example response (shape)
{ "items": [{ "id", "slug", "nameZh", "nameEn", "serviceType", "description", "status", "serviceUrl" }], "count": number, "provenance": Provenance[] }
get_service
Returns one canonical service record by its serviceId.
| Parameter | Type | Required | Description |
|---|---|---|---|
| serviceId | string (1β200) | Yes | Canonical id or slug from search_services |
Example request
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_service","arguments":{"serviceId":"svc_123"}}}
Example response (shape)
{ "service": { "id", "slug", "nameZh", "nameEn", "serviceType", "description", "status", "serviceUrl" }, "provenance": Provenance }
search_members
Searches the public member directory by keyword, research topic, role, or status.
| Parameter | Type | Required | Description |
|---|---|---|---|
| keyword | string (1β100) | No | Free-text name/keyword filter |
| researchTopic | string (1β200) | No | Declared research topic filter |
| role | enum: faculty | student | staff | alumni | No | Filter by role |
| status | enum: active | alumni | No | Filter by membership status |
| limit | integer (1β50) | No | Max results |
Example request
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_members","arguments":{"researchTopic":"NLP"}}}
Example response (shape)
{ "items": [{ "id", "slug", "nameZh", "nameEn", "role", "status", "profileUrl" }], "count": number, "provenance": Provenance[] }
get_member
Returns one canonical public member profile by its memberId.
| Parameter | Type | Required | Description |
|---|---|---|---|
| memberId | string (1β200) | Yes | Canonical id or slug from search_members |
Example response (shape)
{ "member": { "id", "slug", "nameZh", "nameEn", "role", "status", "profileUrl" }, "provenance": Provenance }
find_research_experts
Finds public members whose declared research topics or projects evidence expertise in a topic.
| Parameter | Type | Required | Description |
|---|---|---|---|
| topic | string (2β200) | Yes | Research topic to match against |
| role | enum: faculty | student | staff | No | Filter by role |
| limit | integer (1β20) | No | Max results |
Example request
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"find_research_experts","arguments":{"topic":"agentic AI"}}}
Example response (shape)
{ "items": [{ "member": {...}, "evidence": [{"type":"research_topic"|"project", ...}] }], "count": number, "provenance": Provenance[] }
search_projects
Searches public research projects by keyword, topic, status, or date range.
| Parameter | Type | Required | Description |
|---|---|---|---|
| keyword | string (1β100) | No | Free-text keyword filter |
| topic | string (1β100) | No | Topic filter |
| status | enum: active | completed | planned | No | Filter by project status |
| fromDate | string (YYYY-MM-DD) | No | Exact start-date lower bound |
| toDate | string (YYYY-MM-DD) | No | Exact start-date upper bound |
| limit | integer (1β50) | No | Max results |
Example request
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_projects","arguments":{"topic":"healthcare"}}}
Example response (shape)
{ "items": [{ "id", "slug", "title", "description", "status", "startDate", "endDate" }], "count": number, "provenance": Provenance[] }
get_project
Returns one canonical project record by its projectId.
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectId | string (1β200) | Yes | Canonical id or slug from search_projects |
Example response (shape)
{ "project": { "id", "slug", "title", "description", "status", "startDate", "endDate" }, "provenance": Provenance }
search_documents
Searches public documents by lexical match against title, summary, and text.
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string (1β200) | Yes | Search text |
| documentType | string (1β50) | No | Filter by document type |
| fromDate | string (date-time) | No | Publish-date lower bound |
| toDate | string (date-time) | No | Publish-date upper bound |
| searchMode | enum: lexical | hybrid | No | "hybrid" is not supported in this deployment and returns an explicit error |
| limit | integer (1β20) | No | Max results |
Example request
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_documents","arguments":{"query":"LLM"}}}
Example response (shape)
{ "items": [{ "id", "slug", "title", "documentType", "summary", "publicText", "mimeType" }], "count": number, "provenance": Provenance[] }
get_document
Returns one document's metadata plus its public text by documentId.
| Parameter | Type | Required | Description |
|---|---|---|---|
| documentId | string (1β200) | Yes | Canonical id or slug from search_documents |
Example response (shape)
{ "document": { "id", "slug", "title", "documentType", "summary", "publicText", "mimeType" }, "provenance": Provenance }
search_events
Searches public events by keyword and exact date/type/status filters.
| Parameter | Type | Required | Description |
|---|---|---|---|
| keyword | string (1β100) | No | Title/description keyword filter |
| eventType | string (1β50) | No | Filter by event type |
| status | string (1β50) | No | Filter by event status |
| fromDate | string (date-time) | No | Start-time lower bound |
| toDate | string (date-time) | No | Start-time upper bound |
| limit | integer (1β50) | No | Max results |
Example request
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_events","arguments":{}}}
Example response (shape)
{ "items": [{ "id", "slug", "title", "description", "eventType", "startsAt", "endsAt", "locationText", "status" }], "count": number, "provenance": Provenance[] }
The technical rules behind every response: which protocol versions are supported, how to trust a result, and what an error means.
Supports both the modern stateless MCP core and the legacy initialize handshake.
Every result carries a verifiable source, version, and timestamp.
A fixed set of typed error codes, never a raw stack trace.
MODERN (2026-07-28): uses the stateless MCP protocol core. Clients may use server/discover to inspect server capabilities before making other requests, but discovery is not mandatory. The legacy 2025-11-25 initialize handshake is also supported on the same endpoint.
Every factual tool result includes provenance: sourceId, sourceUnit, sourceUrl, version, publishedAt, effectiveAt, verifiedAt, and contentHash. When no authoritative source exists, the service returns an explicit NO_AUTHORITATIVE_SOURCE error rather than fabricating an answer.
Common error codes: INVALID_ARGUMENT, TOOL_NOT_ALLOWED, NOT_FOUND, NO_AUTHORITATIVE_SOURCE, DATA_STALE, RATE_LIMITED, DEPENDENCY_UNAVAILABLE, INTERNAL_ERROR.
Can AI modify data?
No. Every MCP tool is read-only.
Do I need an API key?
No. Public tools can be used directly.
Are the data sources reliable?
Only allowlisted official sources are used, with provenance attached.
Does MCP crawl the university website in real time?
No. Queries only read already-synced canonical data.
Can it run SQL or shell commands?
No. Those generic tools do not exist.