---
name: mcp-server-architect
description: "Ultimate guide for designing, building, and security-hardening modern AI Tools/Bots via Model Context Protocol (MCP v1.x) in TypeScript and Python / Panduan utama merancang, membangun, dan mengamankan AI Tools/Bots modern melalui Model Context Protocol (MCP) dalam TypeScript dan Python."
author: "Roedy Rustam"
version: "3.0.0"
---

# MCP Server Architect (Modern AI Tools & Agentic Protocol)

[English](#english) | [Bahasa Indonesia](#bahasa-indonesia)

---

<a name="english"></a>
## English

### Orchestration & Integration
Connects and orchestrates with relevant domain skills: `ai-llm-integration-expert` for core LLM routing and RAG pipelines, `mcp-client-orchestrator` for agent client consumption, and `doku-mcp-server` for payments integration examples. Ensure cohesive execution when spawning subagents.

### Description
Ultimate architectural guide for engineering high-performance, production-ready AI Tools/Bots via the **Model Context Protocol (MCP v1.x)**. Enforces the use of `FastMCP` (Python) and `@modelcontextprotocol/sdk` (TypeScript). Mandates strict security guardrails, schema validation, stateful resource streaming, and support for both Standard Stdio and Streamable HTTP / Server-Sent Events (SSE) transports.

### Trigger Conditions
- Building an MCP server to expose tools, resources, or prompt templates to AI agents.
- Integrating backend APIs, file systems, or databases as MCP agent tools.
- Implementing stateful, real-time MCP servers (resource subscriptions, log tailing, live metrics).
- Securing and auditing MCP servers exposing sensitive financial or production data.

---

### SDK Selection (Mandatory Standard)
1. **Python**: `FastMCP` (FastAPI-like high-level DX for MCP tools, resources, and prompt templates).
2. **TypeScript**: `@modelcontextprotocol/sdk` (official SDK using the `McpServer` high-level abstraction with `zod`).

---

### Production Implementation Recipes

#### Recipe 1: Production TypeScript MCP Server (Streamable HTTP / SSE)
```typescript
import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
import express from 'express';
import { z } from 'zod';

// Initialize the high-level MCP Server
const server = new McpServer({
  name: 'enterprise-analytics-mcp',
  version: '1.0.0',
});

// Register a type-safe Tool with Zod validation
server.tool(
  'calculate_metrics',
  'Calculates business analytics metrics across timeframes',
  {
    metricName: z.enum(['arr', 'churn', 'cac', 'ltv']).describe('The metric to compute'),
    quarter: z.string().regex(/^Q[1-4]-202[0-9]$/).describe('Target quarter, e.g., Q1-2026'),
  },
  async ({ metricName, quarter }) => {
    // Implement business logic with database access
    const mockData = { arr: '$2.4M', churn: '1.2%', cac: '$450', ltv: '$9,200' };
    return {
      content: [
        {
          type: 'text',
          text: JSON.stringify({ metric: metricName, quarter, value: mockData[metricName] }),
        },
      ],
    };
  }
);

// Register a Resource Template with dynamic URI
server.resource(
  'system_health',
  new ResourceTemplate('system://health/{service}', { list: undefined }),
  async (uri, { service }) => {
    return {
      contents: [
        {
          uri: uri.href,
          text: JSON.stringify({ service, status: 'HEALTHY', latencyMs: 14, timestamp: new Date().toISOString() }),
        },
      ],
    };
  }
);

// Expose via Express with SSE Transport
const app = express();
let transport: SSEServerTransport | null = null;

app.get('/sse', async (req, res) => {
  transport = new SSEServerTransport('/messages', res);
  await server.connect(transport);
});

app.post('/messages', async (req, res) => {
  if (transport) {
    await transport.handlePostMessage(req, res);
  } else {
    res.status(400).send('Transport not established');
  }
});

app.listen(3001, () => {
  console.log('MCP Server listening on http://localhost:3001/sse');
});
```

#### Recipe 2: Production FastMCP Server (Python)
```python
from fastmcp import FastMCP, Context
from pydantic import BaseModel, Field
from typing import Literal

mcp = FastMCP("enterprise-vault-mcp", dependencies=["pydantic"])

class QueryParams(BaseModel):
    account_id: str = Field(..., description="UUID of customer account")
    status_filter: Literal["active", "suspended", "all"] = Field("active", description="Status filter")

@mcp.tool(name="fetch_account_summary", description="Retrieves account telemetry and balance")
async def fetch_account_summary(params: QueryParams, ctx: Context) -> str:
    ctx.info(f"Auditing request for account: {params.account_id}")
    
    # Secure business logic with RLS validation
    result = {
        "account_id": params.account_id,
        "balance_usd": 125430.50,
        "tier": "enterprise",
        "status": params.status_filter
    }
    return str(result)

@mcp.resource("config://app-settings")
def get_app_settings() -> str:
    """Provides application configuration context to the agent."""
    return '{"environment": "production", "rate_limit_rpm": 600, "region": "ap-southeast-1"}'

if __name__ == "__main__":
    # Runs standard Stdio transport or streamable HTTP
    mcp.run(transport="stdio")
```

---

### Security & Operational Guardrails
1. **OAuth 2.1 & Bearer Authentication**: Bind session tokens to transport connections. Validate claims before executing any tool logic.
2. **Schema Strictness**: Never use untyped payloads. Every argument must have explicit types, range constraints, and descriptions to guide LLM tool-calling accuracy.
3. **Row-Level Security (RLS)**: Enforce tenant and user context propagation to the database layer.
4. **Circuit Breakers & Rate Limits**: Cap consecutive tool executions per agent turn to prevent endless agentic recursive loops.
5. **Idempotency**: All destructive or state-mutating tools must require an `idempotency_key` argument.

### Agent MCP Client Consumption & Tool Discovery
When acting as an AI Agent consuming external MCP servers:
1. **Dynamic Tool Discovery**: Check `list_resources` or `mcp_config.json` before assuming external capabilities do not exist.
2. **Defensive Schema Querying**: Never guess database schema or table names. Always execute `list_tables` or `get_schema` before generating SQL queries (`execute_sql`).
3. **Cross-System Workflow Loop**: Dynamically chain tools across domains: GitHub MCP (find issue) -> `grep_search` (locate file) -> `autonomous-tdd-debugger` (test & fix) -> GitHub MCP (create PR).
4. **Rate Limit Awareness**: Avoid rapid unthrottled loops against external MCP servers.

---

<a name="bahasa-indonesia"></a>
## Bahasa Indonesia

### Integrasi Orkestrasi
Terhubung dan mengorkestrasi dengan skill domain relevan: `ai-llm-integration-expert` untuk perutean LLM inti dan pipeline RAG, `mcp-client-orchestrator` untuk konsumsi klien agen, serta `doku-mcp-server` untuk contoh integrasi pembayaran.

### Deskripsi
Panduan arsitektur utama untuk membangun AI Tools/Bots modern dan siap produksi via **Model Context Protocol (MCP v1.x)**. Mewajibkan penggunaan `FastMCP` (Python) dan `@modelcontextprotocol/sdk` (TypeScript). Menerapkan pengamanan ketat, validasi skema, streaming resource stateful, serta dukungan transport Standar Stdio maupun Streamable HTTP / SSE.

### Kondisi Pemicu
- Membangun server MCP untuk mengekspos alat (*tools*), resource, atau template prompt ke agen AI.
- Mengintegrasikan API backend, sistem file, atau database sebagai alat agen AI.
- Mengimplementasikan server MCP stateful dan real-time (langganan resource, tailing log, metrik langsung).
- Mengamankan server MCP yang mengekspos data finansial atau produksi yang sensitif.

---

### Standar Pemilihan SDK (Wajib)
1. **Python**: `FastMCP` (pengalaman developer tingkat tinggi ala FastAPI untuk tools, resource, dan template prompt).
2. **TypeScript**: `@modelcontextprotocol/sdk` (SDK resmi menggunakan abstraksi `McpServer` dengan `zod`).

---

### Resep Implementasi Produksi

#### Resep 1: Server MCP TypeScript Produksi (Streamable HTTP / SSE)
```typescript
import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
import express from 'express';
import { z } from 'zod';

const server = new McpServer({
  name: 'enterprise-analytics-mcp',
  version: '1.0.0',
});

// Pendaftaran Tool dengan validasi ketat Zod
server.tool(
  'calculate_metrics',
  'Menghitung metrik analitik bisnis untuk kuartal tertentu',
  {
    metricName: z.enum(['arr', 'churn', 'cac', 'ltv']).describe('Metrik yang ingin dihitung'),
    quarter: z.string().regex(/^Q[1-4]-202[0-9]$/).describe('Target kuartal, misal: Q1-2026'),
  },
  async ({ metricName, quarter }) => {
    const data = { arr: '$2.4M', churn: '1.2%', cac: '$450', ltv: '$9,200' };
    return {
      content: [
        {
          type: 'text',
          text: JSON.stringify({ metrik: metricName, kuartal: quarter, nilai: data[metricName] }),
        },
      ],
    };
  }
);

// Pendaftaran Template Resource dengan URI Dinamis
server.resource(
  'system_health',
  new ResourceTemplate('system://health/{service}', { list: undefined }),
  async (uri, { service }) => {
    return {
      contents: [
        {
          uri: uri.href,
          text: JSON.stringify({ layanan: service, status: 'HEALTHY', latensiMs: 14, waktu: new Date().toISOString() }),
        },
      ],
    };
  }
);

const app = express();
let transport: SSEServerTransport | null = null;

app.get('/sse', async (req, res) => {
  transport = new SSEServerTransport('/messages', res);
  await server.connect(transport);
});

app.post('/messages', async (req, res) => {
  if (transport) {
    await transport.handlePostMessage(req, res);
  } else {
    res.status(400).send('Transport belum terhubung');
  }
});

app.listen(3001, () => {
  console.log('Server MCP berjalan pada http://localhost:3001/sse');
});
```

#### Resep 2: Server FastMCP Produksi (Python)
```python
from fastmcp import FastMCP, Context
from pydantic import BaseModel, Field
from typing import Literal

mcp = FastMCP("enterprise-vault-mcp", dependencies=["pydantic"])

class ParameterAkun(BaseModel):
    account_id: str = Field(..., description="UUID akun pengguna")
    status_filter: Literal["active", "suspended", "all"] = Field("active", description="Filter status")

@mcp.tool(name="ambil_ringkasan_akun", description="Mengambil telemetri dan saldo akun")
async def ambil_ringkasan_akun(params: ParameterAkun, ctx: Context) -> str:
    ctx.info(f"Memproses permintaan untuk akun: {params.account_id}")
    hasil = {
        "account_id": params.account_id,
        "saldo_usd": 125430.50,
        "tier": "enterprise",
        "status": params.status_filter
    }
    return str(hasil)

@mcp.resource("config://app-settings")
def ambil_pengaturan_aplikasi() -> str:
    """Menyediakan konteks konfigurasi aplikasi ke agen AI."""
    return '{"environment": "production", "rate_limit_rpm": 600, "region": "ap-southeast-1"}'

if __name__ == "__main__":
    mcp.run(transport="stdio")
```

---

### Keamanan & Batasan Operasional
1. **Otentikasi OAuth 2.1 & Bearer**: Ikat token sesi ke koneksi transport. Validasi hak akses sebelum mengeksekusi logika alat.
2. **Validasi Skema Ketat**: Hindari penggunaan parameter tanpa tipe data yang jelas. Setiap argumen wajib memiliki tipe data, batas nilai, dan deskripsi.
3. **Row-Level Security (RLS)**: Teruskan identitas pengguna dan penyewa (tenant) ke lapisan database driver.
4. **Circuit Breakers & Rate Limits**: Batasi pemanggilan tool berulang dalam satu giliran respon untuk mencegah perulangan tak terkontrol (*infinite loops*).
5. **Idempotency**: Semua tool yang memodifikasi data wajib mendukung argumen `idempotency_key`.
 
### Konsumsi Klien MCP & Eksplorasi Tool oleh Agen
Ketika agen bertindak sebagai Klien MCP:
1. **Eksplorasi Tool Dinamis**: Periksa `list_resources` atau konfigurasi MCP sebelum menyimpulkan kapabilitas tidak tersedia.
2. **Kueri Skema Defensif**: Jangan pernah menebak nama tabel/skema. Selalu gunakan `list_tables` atau `get_schema` sebelum membuat kueri SQL.
3. **Alur Kerja Lintas Sistem**: Rangkaikan pemanggilan tool antar-domain: GitHub MCP -> pencarian kode lokal -> perbaikan otonom -> Pull Request GitHub.
4. **Kesadaran Batas Frekuensi**: Hindari loop pemanggilan berulang tanpa jeda waktu saat memanggil server MCP eksternal.

## Integrasi Orkestrasi
- Terintegrasi dengan: `ai-llm-integration-expert`, `doku-mcp-server`, `zero-trust-secret-vault`.