Skip to main content
Glama
atttx123
by atttx123

WeCom MCP Server

Social Preview

A Python-based MCP (Model Context Protocol) Server for WeCom (WeChat Work / ไผไธšๅพฎไฟก) self-built applications.

Provides a standard set of MCP tools that enable AI Agents (e.g., Trae Work, Claude Desktop) to send messages to WeCom users/departments, query contacts, receive and store messages, and more.

๐ŸŒ ไธญๆ–‡็‰ˆ (Chinese)

โœจ Features

Core Capabilities

  • ๐Ÿ“จ Message Sending: Text, Markdown, generic message bodies, file sending, and @all mass messaging

  • ๐Ÿ“‡ Contact Lookup: Quickly find UserIDs by member name, or batch-retrieve members by department

  • ๐Ÿ“ฅ Message Reception: In HTTP mode, automatically listens for WeCom callbacks and persists received messages to SQLite in real time

  • ๐Ÿ” History Query: Query historical messages by time, type, sender, keywords, and more

  • ๐Ÿ—„๏ธ File Management: Received images/voice/video/files are automatically downloaded to local disk with metadata stored in the database

Technical Highlights

  • Pure-Python AES-256-CBC: No dependency on the cryptography library, avoiding native compilation issues on certain platforms

  • Multiple Transport Support: stdio (single Agent), streamable-http (shared by multiple Agents), sse (legacy compatibility)

  • SQLite Yearly Partitioning: Automatically splits data tables by calendar year to prevent single-table bloat

  • Managed by uv: Ultra-fast package manager and virtual environment

Related MCP server: WeCom MCP

๐Ÿ› ๏ธ MCP Tool List

Universal Tools (Stdio & HTTP/SSE)

Tool Name

Description

send_text_message

Send a text message

send_markdown_message

Send a Markdown message

send_message

Send any type of message (text/markdown/news, etc.)

send_file_message

Send a local file (auto-upload)

mass_send_message

Mass message all members in the app's visible scope (@all)

lookup_user_id

Find UserID by member name

list_users_by_department

List all members in a department (including sub-departments)

check_config

Check current WeCom configuration status

HTTP/SSE Exclusive Tools

Tool Name

Description

health_check

Health check (Webhook status, database status, etc.)

search_history_messages

Query historical messages (filter by time/type/sender/keywords)

get_message_detail

Get details of a single message

get_message_file

Get the local file path associated with a message

list_message_years

List years that have historical data

get_message_stats

Historical message statistics (by type/sender/month)

๐Ÿš€ Quick Start

1. Requirements

  • Python >= 3.14

  • uv package manager

2. Installation & Configuration

# Clone the project
git clone <your-repo-url>
cd wecom-mcp-server

# Create virtual environment and install dependencies
uv sync

# Copy the environment variable template
cp .env.example .env

3. Configuration

Edit .env and fill in your WeCom self-built application credentials:

# Corp ID
WECOM_CORP_ID=ww1234567890abcdef

# Self-built App Secret
WECOM_CORP_SECRET=your_app_secret

# Self-built App AgentId (number)
WECOM_AGENT_ID=1000002

# ====== Optional ======

# Contacts Sync Secret (recommended for full-directory access)
WECOM_CONTACTS_SECRET=your_contacts_secret

# Message callback (only needed for receiving messages / history query)
WECOM_CALLBACK_TOKEN=your_callback_token
WECOM_CALLBACK_ENCODING_AES_KEY=your_aes_key_43_chars_long

# MCP service mode
# stdio: default, single-client local calls
# streamable-http: HTTP service, shared by multiple Agents
# sse: legacy SSE mode
WECOM_MCP_TRANSPORT=streamable-http
WECOM_MCP_HOST=0.0.0.0
WECOM_MCP_PORT=9000

# Data persistence directory
WECOM_DATA_DIR=data

4. Run

Mode 1: Stdio (for Trae Work)

Add to your Trae Work MCP configuration:

{
  "mcpServers": {
    "wecom": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/wecom-mcp-server", "wecom-mcp-server"]
    }
  }
}

Mode 2: HTTP Service (shared by multiple Agents)

# Run in foreground
uv run wecom-mcp-server --transport streamable-http --host 0.0.0.0 --port 9000

# Or use .env configuration
WECOM_MCP_TRANSPORT=streamable-http WECOM_MCP_PORT=9000 uv run wecom-mcp-server

Callers interact with the MCP Server via HTTP:

curl -X POST http://localhost:9000/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": "send_text_message", "arguments": {"to_user": "zhangsan", "content": "Hello!"}}}'

โš™๏ธ Supervisor Deployment

To keep the service running in the background, use supervisord.

Config file: /usr/local/etc/supervisor.d/wecom-mcp-server.conf

[program:wecom-mcp-server]
command=/usr/local/bin/uv run wecom-mcp-server --transport streamable-http --host 0.0.0.0 --port 9000
directory=/path/to/wecom-mcp-server
user=your_username
autostart=true
autorestart=true
startretries=3
stopasgroup=true
killasgroup=true
stderr_logfile=/path/to/logs/wecom-mcp-server.err.log
stdout_logfile=/path/to/logs/wecom-mcp-server.out.log
environment=LANG="en_US.UTF-8",PATH="/usr/local/bin:/usr/bin:/bin"

Common commands:

supervisorctl reread            # Reload configuration
supervisorctl update            # Update process groups
supervisorctl status            # View all service statuses
supervisorctl restart wecom-mcp-server  # Restart service

๐Ÿ“ Project Structure

wecom-mcp-server/
โ”œโ”€โ”€ src/
โ”‚   โ””โ”€โ”€ wecom_mcp_server/
โ”‚       โ”œโ”€โ”€ __init__.py
โ”‚       โ”œโ”€โ”€ server.py          # MCP Server entry point, tool registration
โ”‚       โ”œโ”€โ”€ config.py          # Configuration management (pydantic-settings)
โ”‚       โ”œโ”€โ”€ aes.py             # Pure-Python AES-256-CBC implementation
โ”‚       โ”œโ”€โ”€ crypto.py          # WeCom message encryption/decryption logic
โ”‚       โ”œโ”€โ”€ wecom_client.py    # WeCom API async client
โ”‚       โ”œโ”€โ”€ webhook.py         # Message reception webhook service
โ”‚       โ””โ”€โ”€ storage.py         # SQLite message persistence & file management
โ”œโ”€โ”€ .env.example               # Environment variable example
โ”œโ”€โ”€ pyproject.toml             # Project dependencies & build config
โ””โ”€โ”€ README.md                  # This document

๐Ÿ”‘ Configuration Notes

WeCom App Permissions

  1. Basic Sending Permission: Create a self-built app in the WeCom admin backend and obtain CorpID, Secret, and AgentId.

  2. Contact Reading Permission (optional): Enable API Interface Sync in "Management Tools โ†’ Contact Sync" to get contacts_secret. Without it, only members within the app's visible scope can be read.

  3. Message Reception (optional): Enable API reception in the app's "Receive Messages" settings to get Token and EncodingAESKey. For local development, use an intranet tunnel tool (e.g., ngrok, cloudflared) to expose the callback address.

Data Storage Structure

data/
โ”œโ”€โ”€ wecom_messages.db          # SQLite database (yearly partitioned tables)
โ””โ”€โ”€ files/
    โ”œโ”€โ”€ 2026/
    โ”‚   โ”œโ”€โ”€ 07/
    โ”‚   โ”‚   โ”œโ”€โ”€ image_xxx.jpg
    โ”‚   โ”‚   โ””โ”€โ”€ report.pdf
    โ”‚   โ””โ”€โ”€ ...
    โ””โ”€โ”€ ...

๐Ÿ“œ License

MIT

Available Tools

8 tools
check_configA

ๆฃ€ๆŸฅๅฝ“ๅ‰ WeCom ้…็ฝฎๆ˜ฏๅฆๅฐฑ็ปช (ไธๅ‘่ตท็ฝ‘็ปœ่ฏทๆฑ‚)ใ€‚

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses a key behavioral trait (no network requests), which is useful context, but it does not mention whether the check is read-only, what 'ready' means, or what happens if the config is not ready. Lacks fuller transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence in Chinese that states the purpose and a key behavioral caveat. Every word earns its place; no fluff or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and an output schema, the description is adequate. It covers the tool's core function and adds a behavioral note. It could briefly mention when to use it, but overall the tool is simple and well-described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description does not need to add parameter details, and the schema correctly defines an empty object, so no gaps exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool checks current WeCom configuration readiness. The verb 'ๆฃ€ๆŸฅ' (check) and resource 'ๅฝ“ๅ‰ WeCom ้…็ฝฎ' are specific, and it is clearly distinct from the sibling tools which all send messages or look up users.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives, but the phrase 'ไธๅ‘่ตท็ฝ‘็ปœ่ฏทๆฑ‚' (does not initiate network requests) implies it is a safe, local pre-flight check. No exclusions or alternative tool names are mentioned, so guidance remains implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_users_by_departmentA

ๅˆ—ๅ‡บ้ƒจ้—จๆˆๅ‘˜ (ไป…่ฟ”ๅ›žๅง“ๅ + UserID)ใ€‚

Args: department_id: ้ƒจ้—จ ID๏ผŒ0=ๆ น้ƒจ้—จ (ๅ…จ้ƒจๆˆๅ‘˜) fetch_child: ๆ˜ฏๅฆ้€’ๅฝ’ๅญ้ƒจ้—จ

ParametersJSON Schema
NameRequiredDescriptionDefault
fetch_childNo
department_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden of behavioral disclosure. It reveals the output format ('ไป…่ฟ”ๅ›žๅง“ๅ + UserID') and parameter effects (department_id 0=root, fetch_child recursion). It does not mention permissions, side effects, or error behavior, but for a read-only listing tool this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: one line for the main purpose and a two-line argument block. It is front-loaded with the essential purpose and avoids all fluff. Every element earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple listing tool with two parameters and an output schema, the description adequately covers the purpose, key parameter semantics, and expected return fields. It lacks details on pagination, ordering, or error conditions, but these are not critical given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description provides meaningful explanations for both parameters beyond the schema: department_id semantics (0=root, all members) and fetch_child behavior (recursive sub-departments). The schema itself has zero descriptions, so this fully compensates for the 0% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'ๅˆ—ๅ‡บ้ƒจ้—จๆˆๅ‘˜' (list department members) and specifies output is limited to name + UserID. This is a specific verb and resource, but it doesn't explicitly differentiate from sibling tools (though none are similar listing tools).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied through the description and parameter explanations (e.g., department_id 0 means all members), but no explicit guidance on when to use this vs alternatives or exclusions is provided. Sibling tools like lookup_user_id suggest a potential alternative, but no comparison is made.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lookup_user_idA

้€š่ฟ‡ๆˆๅ‘˜ๅง“ๅๆŸฅๆ‰พ UserID (็”จไบŽๅ‘้€ๆถˆๆฏๆ—ถๆŒ‡ๅฎšๆŽฅๆ”ถไบบ)ใ€‚

ๆ”ฏๆŒ็ฒพ็กฎๅŒน้…๏ผ›่‹ฅๆ— ไบบๅŒน้…ๅˆ™ๆจก็ณŠๅŒน้…ใ€‚ๅคšไบบๅŒๅไผšๅ…จ้ƒจ่ฟ”ๅ›žใ€‚

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses key behavioral traits: exact match first, fall back to fuzzy matching if no exact match, and returns all matching users with the same name. This goes beyond the basic 'lookup' verb. However, it does not mention error handling (e.g., no match found at all) or output format, though the output schema may cover that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences, front-loaded with the main purpose. Every sentence provides value: the first states what it does, the second explains the matching behavior. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple lookup tool with one parameter and an output schema, the description covers the essential context: purpose, matching rules, and multi-result behavior. It does not explicitly state what happens when no fuzzy match is found, but the output schema likely defines the return structure. This is a minor gap for an otherwise simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. The description explains the 'name' parameter as 'ๆˆๅ‘˜ๅง“ๅ' (member name) and adds matching semantics: exact match, fuzzy fallback, and multi-result return. This adds significant meaning beyond the bare schema property definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: '้€š่ฟ‡ๆˆๅ‘˜ๅง“ๅๆŸฅๆ‰พ UserID' (find UserID by member name). This is a specific verb+resource combination. It also distinguishes from siblings by explaining it's for specifying the recipient when sending messages, which differentiates it from list_users_by_department.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context: '็”จไบŽๅ‘้€ๆถˆๆฏๆ—ถๆŒ‡ๅฎšๆŽฅๆ”ถไบบ' (used to specify recipient when sending messages). This informs the agent when to use this tool (before sending messages) but does not explicitly mention alternatives or exclusion conditions. Sibling tool names like send_text_message suggest this is a prerequisite step, but the guidance is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mass_send_messageA

็พคๅ‘ๆถˆๆฏ็ป™ๅบ”็”จๅฏ่ง่Œƒๅ›ดๅ†…็š„ๅ…จ้ƒจๆˆๅ‘˜ (touser=@all)ใ€‚

ๆณจๆ„: @all ไป…่ฆ†็›–ๅบ”็”จๅฏ่ง่Œƒๅ›ด๏ผŒไธๆ˜ฏไผไธšๅ…จ้ƒจๆˆๅ‘˜ใ€‚ ๅฆ‚้œ€ๅ‘็ป™ๅ…จไผไธš๏ผŒ่ฏทๆŠŠๅบ”็”จๅฏ่ง่Œƒๅ›ด่ฎพไธบๆ น้ƒจ้—จใ€‚

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes
agent_idNo
msg_typeNotext

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry behavioral disclosure. It does disclose a key behavioral trait (the @all scope limitation), but it omits other important details such as required permissions, possible rate limits, or error handling. The note adds value but is not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, using only two sentences. The main purpose is front-loaded, the scope caveat is clearly separated, and there is no filler or redundant text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple messaging tool, the description covers the primary purpose and an important scope caveat. However, it lacks parameter semantics and does not mention the output behavior (though an output schema exists). The note about the visible scope is valuable, but the overall completeness is moderate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description provides no information about the 'content', 'agent_id', or 'msg_type' parameters. It only mentions the sending behavior, leaving the agent without guidance on how to properly populate the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool sends mass messages to all members within the app's visible scope (touser=@all). It uses a specific verb (send) and resource (mass message), and the scope limitation distinguishes it from sibling tools that target specific users or departments.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a clear note about the @all scope limitation and explicitly instructs that to reach the whole enterprise, the app's visible scope must be set to the root department. However, it does not explicitly mention when to use alternative tools like send_text_message for targeted sending.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_file_messageA

ๅ‘้€ๆ–‡ไปถ็ป™ไผไธšๅพฎไฟกๆˆๅ‘˜ (่‡ชๅŠจไธŠไผ ๆ–‡ไปถๅนถๅ‘้€)ใ€‚

้™ๅˆถ: ๆ–‡ไปถไธ่ถ…่ฟ‡ 20MBใ€‚media_id ไป… 3 ๅคฉๅ†…ๆœ‰ๆ•ˆใ€‚

ParametersJSON Schema
NameRequiredDescriptionDefault
to_tagNo
to_userNo
agent_idNo
to_partyNo
file_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses auto-upload behavior and the file size/media_id validity constraints, adding some behavioral context. However, it omits error conditions, permissions, or side effects, leaving notable gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences: the first states the purpose, the second states limitations. Every word earns its place, and there is no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having an output schema, the description lacks essential input semantics for the five parameters, making it incomplete for reliable use. The brief purpose and constraints are not enough for an agent to correctly populate recipient fields and file_path.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not mention any parameters. It fails to explain what to_user, to_tag, to_party, agent_id, or even file_path mean, forcing the agent to rely solely on property names. This insufficient compensation for the low schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool sends a file to WeChat Work members and mentions automatic upload, distinguishing it from sibling text/markdown message tools. The verb+resource is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies usage when sending files, with contextual constraints like the 20MB limit and media_id validity. It doesn't explicitly contrast with alternatives like send_text_message, but the purpose is distinct enough to provide clear context without exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_markdown_messageA

ๅ‘้€ Markdown ๆถˆๆฏ (ไป…ไผไธšๅพฎไฟกๅฎขๆˆท็ซฏๆ”ฏๆŒ)ใ€‚

content ็คบไพ‹: # ๆ ‡้ข˜ / ๅŠ ็ฒ— / ้“พๆŽฅ / > ๅผ•็”จ

ParametersJSON Schema
NameRequiredDescriptionDefault
to_tagNo
contentNo
to_userNo
agent_idNo
to_partyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must fully disclose behavioral traits. It only mentions the WeCom client limitation and gives content examples. It fails to explain expected output, error behavior, whether recipients are required, or any side effects, leaving the tool's behavior largely opaque beyond the basic action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely conciseโ€”two short sentences with a clear purpose and useful content examples. Every word earns its place, and the key information is front-loaded. There is no redundancy or padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 5 parameters, no schema descriptions, and no annotations, the description is far too sparse. It covers only the content parameter and the client limitation, leaving recipient parameters and agent_id unexplained, making it incomplete for reliable invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero descriptions for all 5 parameters, so the description must compensate. It only explains the 'content' parameter with formatting examples, but completely omits the semantic meaning of to_user, to_tag, to_party, and agent_id, leaving the recipient selection and configuration fields unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: sending a Markdown message. The verb 'ๅ‘้€' (send) is paired with the resource 'Markdownๆถˆๆฏ' (Markdown message), and it includes a specific constraint that only the WeCom client supports it. This distinguishes it from siblings like send_text_message by format, even though alternatives aren't named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for using the toolโ€”Markdown messagesโ€”and includes a notable usage constraint: only the WeCom client supports it. This implies when not to use it (on other clients) but does not explicitly compare with alternatives like send_text_message or mass_send_message. Thus it offers clear context plus an exclusion, meriting a 4.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_messageA

ๅ‘้€ไปปๆ„็ฑปๅž‹ๅบ”็”จๆถˆๆฏ (้€š็”จๆŽฅๅฃ)ใ€‚

Args: msg_type: text/markdown/textcard/news/image/mpnews/template_card ็ญ‰ content_json: ๅฏนๅบ” msg_type ็š„ๅ†…ๅฎนไฝ“ JSONใ€‚ text: {"content":"ๆ–‡ๆœฌ"} markdown: {"content":"# ๆ ‡้ข˜"} textcard: {"title":"ๆ ‡้ข˜","description":"ๆ่ฟฐ","url":"https://..."} agent_id: ๅบ”็”จ AgentId๏ผŒ็•™็ฉบไฝฟ็”จ้ป˜่ฎค้…็ฝฎ

ParametersJSON Schema
NameRequiredDescriptionDefault
to_tagNo
to_userNo
agent_idNo
msg_typeNotext
to_partyNo
content_jsonNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden for behavioral disclosure. It does reveal that msg_type accepts specific values, provides example content_json structures for common types, and explains agent_id's default behavior. However, it does not disclose potential side effects (e.g., message delivery may fail silently), any authentication/permission requirements, rate limits, or what happens if no recipients are specified. The disclosed information is helpful but incomplete for a state-changing operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and relatively well-structured, starting with a one-line purpose then an Args section with parameter definitions and examples. It avoids unnecessary verbosity and front-loads the core purpose. However, the parameter documentation is somewhat dense and not uniformly formatted, slightly reducing readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (6 parameters, no annotations, generic purpose), the description is incomplete. It fails to explain three of the six parameters (to_user, to_party, to_tag) which are crucial for directing a message. It also lacks guidance on whether at least one recipient is required and how multiple recipients are specified. The output schema reduces the need for return-value details, but the missing recipient semantics are a critical gap in context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema only provides titles and defaults for six parameters, with no descriptions. The tool description adds meaning for msg_type (list of allowed values), content_json (with examples for text, markdown, and textcard), and agent_id (purpose and default behavior). However, it completely omits semantics for to_user, to_party, and to_tag, which are essential recipient fields. Thus, it partially compensates for the schema's lack of descriptions but leaves significant gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'ๅ‘้€ไปปๆ„็ฑปๅž‹ๅบ”็”จๆถˆๆฏ (้€š็”จๆŽฅๅฃ)' meaning 'Send any type of application message (generic interface)'. This uses a specific verb (send), a clear resource (application message), and explicitly labels itself as a generic interface, which differentiates it from sibling tools like send_text_message and send_markdown_message that handle specific message types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates this is a generic interface for any message type, which strongly implies it should be used when specialized send tools (e.g., send_text_message, send_markdown_message) are insufficient or when dealing with less common types like news or template_card. However, it does not explicitly state when not to use it or name alternatives, missing a fully explicit exclusion. The context is clear but not fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_text_messageB

ๅ‘ไผไธšๅพฎไฟกๆˆๅ‘˜ๅ‘้€ๆ–‡ๆœฌๆถˆๆฏใ€‚

Args: to_user: ๆŽฅๆ”ถไบบ userid๏ผŒๅคšไบบ็”จ "|" ๅˆ†้š” to_party: ๆŽฅๆ”ถ้ƒจ้—จ id๏ผŒๅคšไธช็”จ "|" ๅˆ†้š” to_tag: ๆŽฅๆ”ถๆ ‡็ญพ id๏ผŒๅคšไธช็”จ "|" ๅˆ†้š” content: ๆ–‡ๆœฌๅ†…ๅฎน agent_id: ๅบ”็”จ AgentId๏ผŒ็•™็ฉบไฝฟ็”จ้ป˜่ฎค้…็ฝฎ

ParametersJSON Schema
NameRequiredDescriptionDefault
to_tagNo
contentNo
to_userNo
agent_idNo
to_partyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears full responsibility for behavioral disclosure. It clearly indicates the action (sending a message), but it does not disclose potential side effects, permission requirements, rate limits, or handling of missing recipient fields. For a mutation-like operation, this lack of context leaves significant behavioral ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise: one sentence for purpose, followed by a compact Args list. Every line provides essential information without fluff. The use of a bullet-like format (though in plain text) is clean and easy to parse. It earns its place entirely.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple send-message tool with an output schema, the description covers all parameters adequately. However, it lacks any contextual information about prerequisites (e.g., at least one recipient field must be set) or integration with authentication, and does not address sibling tool distinctions. The presence of an output schema reduces the need to explain return values, but the missing usage context makes it only minimally complete for an agent to confidently select it over alternatives.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description fully compensates by explaining every parameter: to_user (userid, multiple via '|'), to_party (dept id), to_tag (tag id), content (text), agent_id (leave empty for default). It adds critical formatting details like the '|' separator and default behavior for agent_id, which the schema completely lacks. This is excellent parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the purpose: 'ๅ‘ไผไธšๅพฎไฟกๆˆๅ‘˜ๅ‘้€ๆ–‡ๆœฌๆถˆๆฏ' (send text messages to WeCom members). This provides a specific verb and resource. However, it does not explicitly distinguish itself from sibling tools like send_message or mass_send_message, relying on the word 'ๆ–‡ๆœฌ' (text) to imply its scope. The tool name already conveys this, so slightly less credit for differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus the siblings (send_markdown_message, send_file_message, mass_send_message, etc.). The description only states what it does, not when it should be preferred. No exclusions or alternatives are mentioned, so it provides minimal usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 8 tool updatesv0.1.0
    • First observedcheck_config
    • First observedlist_users_by_department
    • First observedlookup_user_id
    • First observedmass_send_message
    • First observedsend_file_message
    • First observedsend_markdown_message
    • First observedsend_message
    • First observedsend_text_message

TDQS

A3.9/5.0
Disambiguation4/5

Most tools have clearly distinct purposes, but send_message can also send text/markdown, overlapping with send_text_message and send_markdown_message. The generic tool is described as a universal interface, but the overlap could still cause selection confusion.

Naming Consistency5/5

All tools follow a consistent verb_noun snake_case pattern: send_text_message, send_markdown_message, lookup_user_id, list_users_by_department, check_config. The only slight deviation is send_message, but it is still a clear verb_noun form.

Tool Count5/5

8 tools is well-scoped for a WeCom messaging integration. Each tool covers a distinct function: sending different message types, mass send, user lookup, department listing, and configuration check, without unnecessary bloat.

Completeness4/5

Core messaging workflows are covered: text, markdown, file, generic types, mass send, and user retrieval. Minor gaps include lack of a dedicated media upload tool for images/news and no message status query, but these are not critical for a simple messaging server.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to send WeChat messages through automation, supporting both immediate and scheduled message delivery to contacts and groups using the Model Context Protocol standard.
    35
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to interact with Enterprise WeChat (WeCom) using natural language to manage meetings, book rooms, and search contacts. It supports multiple AI models and provides intelligent contact matching via Pinyin.
    1
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Provides WeChat automation capabilities for AI development tools via the Model Context Protocol. It enables users to send messages, manage contacts, and handle file transfers through AI assistants like Claude and Cursor.
    27
    28
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/atttx123/wecom-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server