Uno MCP Tools
Call MCPMarket REST APIs directly via curl to search and invoke 1500+ tools from 134+ MCP Servers. No package installation required.
Prerequisites
curl(pre-installed on all systems)
Authentication
# 1. Request a device code
curl -s -X POST https://mcpmarket.cn/oauth/device/code \
-d "client_id=skill-agent&scope=mcp:*"
Always copy the verification_uri and user_code from terminal output verbatim to display to the user — never construct or modify the URL yourself.
# 2. Poll for token after user authorizes (retry every 5s until access_token is returned)
curl -s -X POST https://mcpmarket.cn/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=urn:ietf:params:oauth:grant-type:device_code&device_code=DEVICE_CODE&client_id=skill-agent"
# 3. Store the token securely
mkdir -p ~/.uno && chmod 700 ~/.uno
echo "ACCESS_TOKEN_VALUE" > ~/.uno/token && chmod 600 ~/.uno/token
Verify login:
curl -s https://mcpmarket.cn/api/uno/verify-token \
-H "Authorization: Bearer $(cat ~/.uno/token)"
Two-Step Invocation (Core Flow)
# Step 1: Search tools — get tool_name and inputSchema
curl -s "https://mcpmarket.cn/api/uno/search-tools?q=weather&mode=hybrid&limit=5" \
-H "Authorization: Bearer $(cat ~/.uno/token)"
# Step 2: Call the tool
curl -s -X POST https://mcpmarket.cn/api/uno/call-tool \
-H "Authorization: Bearer $(cat ~/.uno/token)" \
-H "Content-Type: application/json" \
-d '{"tool_name":"tonghu-weather.weatherArea","arguments":{"area":"Beijing"}}'
API Endpoints
| Endpoint | Method | Description |
|---|---|---|
/api/uno/search-tools | GET | Search tools (main entry) — returns tools + full inputSchema |
/api/uno/search-servers | GET | Search servers |
/api/uno/call-tool | POST | Call a tool (format: server_name.tool_name) |
/api/uno/categories | GET | List all categories with counts |
/api/uno/rate-server | POST | Rate after use — influences search ranking |
All endpoints use base URL https://mcpmarket.cn and require an Authorization: Bearer <token> header.
search-tools Parameters
| Parameter | Type | Description |
|---|---|---|
q | string | Search keywords |
category | string | Browse by category, e.g. Search, Dev, Finance, Social |
mode | string | keyword (exact) / semantic / hybrid (recommended) |
limit | int | Number of results, default 5, max 15 |
Returns: tools[] (with tool, desc, inputSchema), uncached (servers requiring connection first)
Search keyword tips: The vector database indexes tool functional descriptions. Search terms should match tool capabilities, not specific query intents.
- Good:
weather— matches weather tool descriptions - Bad:
Shanghai weather tomorrow— reads like a query intent, less likely to match tools
call-tool Parameters
| Parameter | Type | Description |
|---|---|---|
tool_name | string | Required — format server_name.tool_name (from the tool field of search-tools) |
arguments | object | Required — construct according to inputSchema |
Response structure:
{"content": [{"type": "text", "text": "<JSON string>"}], "isError": false}
content[0].textis itself a JSON string that needs secondary parsing. On error,isErroristrueand theerrorfield contains the error message.
Downstream OAuth: When calling certain services (e.g. GitHub, Notion) for the first time, the response will be:
{"auth_required": true, "auth_url": "https://...", "state_id": "..."}
Open auth_url to complete authorization, then simply retry the call — the platform links everything server-side automatically.
Parameter Construction Rules (Must Read)
Always read inputSchema before calling — never guess parameters. Checklist:
| Check | Why | Lesson Learned |
|---|---|---|
required fields | Must provide every one | Missing fields cause errors |
minLength: 1 | Cannot pass empty string "" | Notion search with empty query returns nothing |
| Copy field names from schema verbatim | Don't write from memory | filter vs filters — one letter causes failure |
enum constraints | Only pass values within the enum | Wrong values cause silent failure |
description | Read when field meaning is unclear | Prevents format errors |
Standard two-step flow (never skip step 1):
# Step 1: search-tools, read inputSchema (mandatory every time)
curl -s "https://mcpmarket.cn/api/uno/search-tools?q=<capability_keyword>&mode=hybrid&limit=5" \
-H "Authorization: Bearer $(cat ~/.uno/token)"
# → Carefully check required / minLength / field names / enum
# Step 2: Construct correct parameters from schema and call
curl -s -X POST https://mcpmarket.cn/api/uno/call-tool \
-H "Authorization: Bearer $(cat ~/.uno/token)" \
-H "Content-Type: application/json" \
-d '{"tool_name":"<tool>","arguments":{<fill per schema>}}'
Workflow Recommendations
- Always search-tools first, read inputSchema before calling — this is the most important step, never skip it
- Search terms should match tool capabilities, not query intents —
weatheris good,Shanghai weather tomorrowis bad - Copy parameter names from schema verbatim — don't guess;
filtersis notfilter - No results? — try English keywords, or switch to
mode=semantic
Credential Reference
| Item | Value |
|---|---|
| Token file | ~/.uno/token (permissions 0600) |
| API Base URL | https://mcpmarket.cn |
| Logout | rm ~/.uno/token |