name: "mock-server" # Proxy service name, globally unique
tenant: "default" # Tenant identifier for multi-tenant scenarios
# Routing configuration
routers:
- server: "mock-server" # Service name
prefix: "/gateway/user" # Route prefix, globally unique, non-repeatable, recommended to distinguish prefixes by service or domain+module
# CORS configuration
cors:
allowOrigins: # Development and test environments can be fully open, production should be opened as needed. (Most MCP Clients do not need to open cross-origin)
- "*"
allowMethods: # Allowed request methods, open as needed, for MCP (SSE and Streamable) usually only these 3 methods are needed
- "GET"
- "POST"
- "PUT"
- "OPTIONS"
allowHeaders:
- "Content-Type" # Must be allowed
- "Authorization" # Required for authentication needs to support carrying this key in requests
- "Mcp-Session-Id" # For MCP, must support carrying this key in requests, otherwise Streamable HTTP cannot be used normally
- "mcp-protocol-version" # MCP protocol version header for protocol version negotiation
exposeHeaders:
- "Mcp-Session-Id" # For MCP, when cross-origin is enabled, this key must be exposed, otherwise Streamable HTTP cannot be used normally
- "mcp-protocol-version" # MCP protocol version header
allowCredentials: true # Whether to add Access-Control-Allow-Credentials: true header
# Service configuration
servers:
- name: "mock-server" # Service name, must match server in routers
description: "Mock User Service" # Service description
allowedTools: # List of allowed tools (subset of tools)
- "register_user"
- "get_user_by_email"
- "update_user_preferences"
- "update_user_avatar"
config: # Service-level configuration, can be referenced in tools via {{.Config}}
Cookie: 123 # Hardcoded configuration
Authorization: 'Bearer {{ env "AUTH_TOKEN" }}' # Configuration from environment variables, usage is '{{ env "ENV_VAR_NAME" }}'
# Tool configuration
tools:
- name: "register_user" # Tool name
description: "Register a new user" # Tool description
method: "POST" # HTTP method for requesting target (upstream, backend) service
endpoint: "http://localhost:5236/users" # Target service address
headers: # Request header configuration for carrying headers when requesting target service
Content-Type: "application/json" # Hardcoded request header
Authorization: "{{.Config.Authorization}}" # Use value from service configuration
Cookie: "{{.Config.Cookie}}" # Use value from service configuration
args: # Parameter configuration
- name: "username" # Parameter name
position: "body" # Parameter position: header, query, path, body, form-data
required: true # Whether parameter is required
type: "string" # Parameter type
description: "Username" # Parameter description
default: "" # Default value
- name: "email"
position: "body"
required: true
type: "string"
description: "Email"
default: ""
requestBody: |- # Request body template for dynamically generating request body, e.g., values extracted from parameters (MCP request arguments)
{
"username": "{{.Args.username}}",
"email": "{{.Args.email}}"
}
responseBody: |- # Response body template for dynamically generating response body, e.g., values extracted from response
{
"id": "{{.Response.Data.id}}",
"username": "{{.Response.Data.username}}",
"email": "{{.Response.Data.email}}",
"createdAt": "{{.Response.Data.createdAt}}"
}
- name: "get_user_by_email"
description: "Get user by email"
method: "GET"
endpoint: "http://localhost:5236/users/email/{{.Args.email}}"
args:
- name: "email"
position: "path"
required: true
type: "string"
description: "Email"
default: ""
responseBody: |-
{
"id": "{{.Response.Data.id}}",
"username": "{{.Response.Data.username}}",
"email": "{{.Response.Data.email}}",
"createdAt": "{{.Response.Data.createdAt}}"
}
- name: "update_user_preferences"
description: "Update user preferences"
method: "PUT"
endpoint: "http://localhost:5236/users/{{.Args.email}}/preferences"
headers:
Content-Type: "application/json"
Authorization: "{{.Request.Headers.Authorization}}"
Cookie: "{{.Config.Cookie}}"
args:
- name: "email"
position: "path"
required: true
type: "string"
description: "Email"
default: ""
- name: "isPublic"
position: "body"
required: true
type: "boolean"
description: "Whether the user profile is public"
default: "false"
- name: "showEmail"
position: "body"
required: true
type: "boolean"
description: "Whether to show email in profile"
default: "true"
- name: "theme"
position: "body"
required: true
type: "string"
description: "User interface theme"
default: "light"
- name: "tags"
position: "body"
required: true
type: "array"
items:
type: "string"
enum: ["developer", "designer", "manager", "tester"]
description: "User role tags"
default: "[]"
- name: "settings"
position: "body"
required: false
type: "object"
description: "User custom settings as key-value pairs"
default: "{}"
- name: "notifications"
position: "body"
required: false
type: "array"
description: "User notification preferences"
items:
type: "object"
properties:
type:
type: "string"
description: "Notification type (email, push, sms)"
channel:
type: "string"
description: "Notification channel (marketing, system, security)"
enabled:
type: "boolean"
description: "Whether this notification is enabled"
frequency:
type: "number"
description: "Notification frequency (0: realtime, 1: daily, 2: weekly, 3: monthly)"
default: "[]"
requestBody: |-
{
"isPublic": {{.Args.isPublic}},
"showEmail": {{.Args.showEmail}},
"theme": "{{.Args.theme}}",
"tags": {{.Args.tags}},
"settings": {{ toJSON .Args.settings }},
"notifications": {{ .Args.notifications }}
}
responseBody: |-
{
"id": "{{.Response.Data.id}}",
"username": "{{.Response.Data.username}}",
"email": "{{.Response.Data.email}}",
"createdAt": "{{.Response.Data.createdAt}}",
"preferences": {
"isPublic": {{.Response.Data.preferences.isPublic}},
"showEmail": {{.Response.Data.preferences.showEmail}},
"theme": "{{.Response.Data.preferences.theme}}",
"tags": {{.Response.Data.preferences.tags}},
"settings": {{ toJSON .Response.Data.preferences.settings }},
"notifications": {{ toJSON .Response.Data.preferences.notifications }}
}
}
- name: "update_user_avatar"
description: "Update user avatar using a URL via multipart form"
method: "POST"
endpoint: "http://localhost:5236/users/{{.Args.email}}/avatar"
headers:
Authorization: "{{.Request.Headers.Authorization}}"
Cookie: "{{.Config.Cookie}}"
args:
- name: "email"
position: "path"
required: true
type: "string"
description: "Email of the user"
default: ""
- name: "url"
position: "form-data"
required: true
type: "string"
description: "The avatar image URL"
default: ""
responseBody: |-
{
"message": "{{.Response.Data.message}}",
"avatarUrl": "{{.Response.Data.avatarUrl}}"
}