NTPU AI4X MCP Documentation

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.

Overview

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.

Public Data

Only NTPU AI4X's official public data is provided.

Read-Only Tools

MCP tools never modify data and never provide arbitrary command execution.

Verifiable Sources

Every tool response carries provenance, source, and version information.

No API Key

The public MCP endpoint can be connected to directly by any MCP-capable client.

Quick Start

Most users never need to send JSON-RPC by hand. Pick the MCP client you use and follow the steps below.

  1. 1

    Choose an MCP client

    Pick the tab below for the client you use.

  2. 2

    Add AI4X MCP

    Copy that client's configuration snippet and restart it if needed.

  3. 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.

JSON
{
  "mcpServers": {
    "ai4x": {
      "url": "https://ai4x.mcp.ntpu.ai/mcp"
    }
  }
}

You're connected once: you get real data back, the response includes a source, and no API key was needed.

Test raw JSON-RPC directly

A legacy-compatible JSON-RPC request against tools/list:

cURL
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.

API Tools

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.

Center

Center Info get_center_info
Public Β· L0 R0 Read only

Returns official center-level facts: name, mission, start date, and public website.

This tool takes no parameters.

Example request

JSON
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_center_info","arguments":{}}}

Example response (shape)

JSON
{ "center": { "nameZh": string, "nameEn": string|null, "mission": string|null, "officialStartDate": string|null, "website": string }, "provenance": Provenance }
Try in Playground β†’

Services

Search Services search_services
Public Β· L0 R0 Read only

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

JSON
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_services","arguments":{"keyword":"cloud","limit":5}}}

Example response (shape)

JSON
{ "items": [{ "id", "slug", "nameZh", "nameEn", "serviceType", "description", "status", "serviceUrl" }], "count": number, "provenance": Provenance[] }
Try in Playground β†’
Get Service get_service
Public Β· L0 R0 Read only

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

JSON
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_service","arguments":{"serviceId":"svc_123"}}}

Example response (shape)

JSON
{ "service": { "id", "slug", "nameZh", "nameEn", "serviceType", "description", "status", "serviceUrl" }, "provenance": Provenance }
Try in Playground β†’

Members

Search Members search_members
Public Β· L0 R0 Read only

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

JSON
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_members","arguments":{"researchTopic":"NLP"}}}

Example response (shape)

JSON
{ "items": [{ "id", "slug", "nameZh", "nameEn", "role", "status", "profileUrl" }], "count": number, "provenance": Provenance[] }
Try in Playground β†’
Get Member get_member
Public Β· L0 R0 Read only

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)

JSON
{ "member": { "id", "slug", "nameZh", "nameEn", "role", "status", "profileUrl" }, "provenance": Provenance }
Try in Playground β†’
Find Research Experts find_research_experts
Public Β· L0 R0 Read only

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

JSON
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"find_research_experts","arguments":{"topic":"agentic AI"}}}

Example response (shape)

JSON
{ "items": [{ "member": {...}, "evidence": [{"type":"research_topic"|"project", ...}] }], "count": number, "provenance": Provenance[] }
Try in Playground β†’

Projects

Search Projects search_projects
Public Β· L0 R0 Read only

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

JSON
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_projects","arguments":{"topic":"healthcare"}}}

Example response (shape)

JSON
{ "items": [{ "id", "slug", "title", "description", "status", "startDate", "endDate" }], "count": number, "provenance": Provenance[] }
Try in Playground β†’
Get Project get_project
Public Β· L0 R0 Read only

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)

JSON
{ "project": { "id", "slug", "title", "description", "status", "startDate", "endDate" }, "provenance": Provenance }
Try in Playground β†’

Documents

Search Documents search_documents
Public Β· L0 R0 Read only

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

JSON
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_documents","arguments":{"query":"LLM"}}}

Example response (shape)

JSON
{ "items": [{ "id", "slug", "title", "documentType", "summary", "publicText", "mimeType" }], "count": number, "provenance": Provenance[] }
Try in Playground β†’
Get Document get_document
Public Β· L0 R0 Read only

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)

JSON
{ "document": { "id", "slug", "title", "documentType", "summary", "publicText", "mimeType" }, "provenance": Provenance }
Try in Playground β†’

Events

Search Events search_events
Public Β· L0 R0 Read only

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

JSON
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_events","arguments":{}}}

Example response (shape)

JSON
{ "items": [{ "id", "slug", "title", "description", "eventType", "startsAt", "endsAt", "locationText", "status" }], "count": number, "provenance": Provenance[] }
Try in Playground β†’

Protocol & Sources

The technical rules behind every response: which protocol versions are supported, how to trust a result, and what an error means.

Protocol Compatibility

Supports both the modern stateless MCP core and the legacy initialize handshake.

Data & Provenance

Every result carries a verifiable source, version, and timestamp.

Errors & Troubleshooting

A fixed set of typed error codes, never a raw stack trace.

Expand technical detail

Protocol Compatibility

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.

Data & Provenance

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.

Errors & Troubleshooting

Common error codes: INVALID_ARGUMENT, TOOL_NOT_ALLOWED, NOT_FOUND, NO_AUTHORITATIVE_SOURCE, DATA_STALE, RATE_LIMITED, DEPENDENCY_UNAVAILABLE, INTERNAL_ERROR.

Security & Privacy

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.

Further Reading