A personal collection of practical MCP tools for coding agents, covering common development, workflow, and automation tasks.
An MCP server for work-related tools used by local agents.
Tools are grouped by plugin. Each plugin is enabled or disabled as a unit in config.yaml.
| Plugin | Tools |
|---|---|
database | db_list_databases, db_list_tables, db_get_table_schema, db_execute_query |
dingtalk | dingtalk_send_markdown |
jira | jira_get_latest_assigned_issue, jira_start_issue, jira_resolve_issue |
log_search | list_log_files, search_log |
All configuration lives in config.yaml. To disable a plugin and all its tools, comment out its name in plugins.enabled.
Configure a read-only database account for live debugging queries. Supports SQL Server and MySQL.
Configure in config.yaml:
SQL Server:
plugins:
enabled:
- database
database:
type: sqlserver
host: your-sqlserver-host.example.com
port: 1433
user: readonly_user
password: your_password_here
driver: ODBC Driver 18 for SQL Server
trust_server_certificate: true
connect_timeout_seconds: 5MySQL:
plugins:
enabled:
- database
database:
type: mysql
host: your-mysql-host.example.com
port: 3306
user: readonly_user
password: your_password_here
connect_timeout_seconds: 5user must be a read-only database account. Tool-layer SQL validation is only defense in depth and is not the primary safety boundary.driver must match the installed driver name.trust_server_certificate: true is only appropriate for environments where you intentionally bypass certificate validation (SQL Server only).pymysql — no ODBC driver needed. driver and trust_server_certificate are ignored for MySQL.startup.healthcheck.enabled=true, the database plugin performs a live connectivity probe on startup. Startup stops if the connection fails.1. Create a robot — open the group settings in DingTalk → Robot Management → add a custom webhook robot. Copy the webhook URL. If you enable additional secret which used to replace keyword, also copy the signing secret.
2. Configure in config.yaml:
plugins:
enabled:
- dingtalk
dingtalk:
webhook_url: https://oapi.dingtalk.com/robot/send?access_token=your_token_here
secret: SECxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsecret is only required when the robot has additional secret enabled. If it is required but missing, sends will fail with a signature mismatch error.
1. Discover your workflow status names:
uv run python scripts/inspect_jira_issue_workflow.py YOUR-123This prints every status name and available transition for that issue. Use the output to fill in the next step.
2. Configure in config.yaml:
plugins:
enabled:
- jira
jira:
base_url: https://your-jira-instance.example.com
api_token: your_jira_api_token_here
project_key: PROJECT1
latest_assigned_statuses: # statuses that jira_get_latest_assigned_issue will return
- 待处理
- 已接收
- 处理中
start_target_status: 已接收 # target status for jira_start_issue
resolve_target_status: 已解决 # target status for jira_resolve_issue
attachments:
max_images: 5
max_bytes_per_image: 1048576api_token — create one at your Jira profile → Personal Access Tokens.project_key — the short key for the project this server is allowed to query and update (e.g. IOS, PROJECT1).startup.healthcheck.enabled=true, the Jira plugin probes GET /rest/api/2/serverInfo and GET /rest/api/2/myself using the configured base URL and token. Startup stops if Jira is unreachable or authentication fails.These must be exact Jira status names (not category names like In Progress or Done). If multiple transitions reach the same target status, the tool returns a transition_ambiguous error — rename statuses or adjust the workflow to resolve it.
Note
Jira image attachments are currently exposed as metadata only. Most MCP coding clients still operate as text-first chat workflows, and returning raw image bytes or base64 does not reliably trigger image understanding. In practice that mostly wastes context window, so this server surfaces attachment metadata and asks the agent to request a user summary when visual details may matter.
Configure a log root directory that the tools can browse and search.
plugins:
enabled:
- log_search
log_search:
log_base_dir: /absolute/path/to/logslist_log_files lists one level of files and directories under the log root or a relative path.search_log searches a single file selected from list_log_files.log_base_dir should point to the top-level directory that contains your service, date, or instance log folders.config.yaml settingslogging:
dir: logs
level: info # debug | info | warning | errorlogging.dir is optional and defaults to logs.logs means ./logs wherever you start the server. Absolute paths are allowed.logging.level is optional and must be one of debug, info, warning, or error.register_<name>_tools(mcp: FastMCP, settings: Settings) under src/work_mcp/tools/.src/work_mcp/tools/<name>.py.src/work_mcp/tools/<name>/.PLUGIN_REGISTRY in src/work_mcp/tools/__init__.py.plugins.enabled in config.yaml.Point your MCP client or agent at the packaged entry point:
{
"mcpServers": {
"work-mcp": {
"command": "uv",
"args": ["run", "work-mcp"],
"cwd": "/absolute/path/to/work-mcp"
}
}
}If your MCP client starts servers from the current repository root, cwd can usually be omitted.
This launches the server over stdio, which is the default MCP setup for local agents.
uv run work-mcpThis starts the server over stdio.
Run in HTTP mode:
make runOverride the bind address or port when needed:
make run HOST=0.0.0.0 PORT=9000Or call the entry point directly:
uv run work-mcp --transport streamable-http --host 0.0.0.0 --port 8182For an agent or MCP client that connects over HTTP, point it at the running server's /mcp endpoint, for example http://127.0.0.1:8182/mcp.
Use scripts/preview_tool.py to preview and debug tools registered by this server.
List tools:
uv run python scripts/preview_tool.py listShow one tool's schema:
uv run python scripts/preview_tool.py describe dingtalk_send_markdownCall one tool:
uv run python scripts/preview_tool.py call dingtalk_send_markdown \
--args '{"title":"Smoke Test","markdown":"hello from local preview"}'
uv run python scripts/preview_tool.py call db_list_databases \
--args '{}'
Inspect one Jira issue's current status and available workflow transitions:
uv run python scripts/inspect_jira_issue_workflow.py IOS-123This single command prints:
statusCategory valuesstatus valuesjiyi27/work-mcp
April 3, 2026
April 13, 2026
Python