A Model Context Protocol (MCP) server for creating and managing LinkedIn posts
The server defines 4 tools with explicit schemas and basic descriptions. However, several critical issues prevent a higher score: (1) descriptions are minimal (most under 80 chars, well below the 194-char baseline for A+ tools); (2) parameter descriptions are generic or missing ('visibility' enum lacks explanation of what PUBLIC vs CONNECTIONS means); (3) no output schema documentation, callers must infer what fields are returned; (4) error handling is present but not actionable (returns generic success strings rather than structured data with field-level guidance); (5) tool names are adequate but descriptions lack the WHEN and WHY context that guides LLM selection. Most parameters have types, but descriptions fail to explain constraints, formats, or dependencies.
Create a LinkedIn post with an image
Create a text-only LinkedIn post
Get the authenticated user's LinkedIn profile information
Validate that LinkedIn credentials are working
Parameter descriptions are missing or generic. 'visibility' enum lists PUBLIC and CONNECTIONS but does not explain what each means (e.g., PUBLIC = visible to all LinkedIn users, CONNECTIONS = visible only to your connections). 'imageUrl' has no guidance on format, size limits, or supported MIME types.
No output schema documentation. Callers receive text-only responses (e.g., 'LinkedIn post created successfully! Post ID: ...'). The server must document what fields are returned, their types, and how to chain them to downstream tools. Currently, an LLM cannot programmatically extract the post ID for follow-up actions.
Tool descriptions are too short and lack actionable guidance. 'Create a text-only LinkedIn post' (36 chars) does not explain when to use this over create_linkedin_image_post, what prerequisites exist (e.g., authentication, API rate limits), or what side effects occur. Per the 194-char baseline for A+ tools, descriptions should be 2-3x longer.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 41 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 42 | - | v1 |
Error handling returns plaintext strings instead of structured error responses. When validation fails or the LinkedIn API returns an error, the response is a bare text message. LLMs cannot parse recovery hints or classify the error as retryable, user-fixable, or fatal.
Tool does not distinguish read-only vs write tools in the response. While tool_risk labels them in your metadata, the MCP response does not use tool annotations (readOnlyHint/destructiveHint). This leaves LLMs unable to reason about side effects without reading descriptions.
No idempotency or confirmation pattern for destructive operations. Calling create_linkedin_post twice with the same text will create two posts. No dry-run or confirmation_required mechanism prevents accidental duplicates.
Parameter 'imageUrl' accepts any string without validation. No guidance on URL format (http vs https), response code expectations, image dimensions, or MIME types. The server will likely accept invalid URLs and fail at runtime with unhelpful errors.