Best for
- Exposing a system's capabilities to an LLM client.
- Wrapping an internal API for agent use.
- Improving an MCP server whose tools the model uses incorrectly.
nimadorostkar/Claude-Skills-collection/skills/ai/mcp-server/SKILL.md
Use when building a Model Context Protocol server. Covers tool, resource, and prompt design, transport choice, authentication, error handling, and testing an MCP server against a real client.
Decision brief
Covers tool, resource, and prompt design, transport choice, authentication, error handling, and testing an MCP server against a real client.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Not declared | No explicit evidence | Portability before use |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/nimadorostkar/Claude-Skills-collection --skill "skills/ai/mcp-server"Inspect the Agent Skill "mcp-server" from https://github.com/nimadorostkar/Claude-Skills-collection/blob/03f39b7041ec2679255f8d6bb5b18421561821ae/skills/ai/mcp-server/SKILL.md at commit 03f39b7041ec2679255f8d6bb5b18421561821ae. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
1. Design around tasks, not endpoints — Do not mirror your REST API one-to-one. A model needs findorderbycustomer, not GET /orders with fourteen optional query parameters. 2. Write the description as if it were the prompt — Because it is. State what the tool does, when to use it…
Build an MCP server that a model can use correctly. The protocol is straightforward; the difficulty is designing a tool surface that a language model uses well, which is a different problem from designing an API for a programmer.
Exposing a system's capabilities to an LLM client.
Tool design: granularity, naming, schema, and descriptions.
The underlying system and its API.
Permission review
The documentation asks the agent to read local files, directories, or repositories.
contents: [{ uri: "schema://orders", text: await readFile("docs/order-schema.md") }],Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 95/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 26 | Source | Repository attention, not individual Skill quality |
| Compatibility | 0 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Build an MCP server that a model can use correctly. The protocol is straightforward; the difficulty is designing a tool surface that a language model uses well, which is a different problem from designing an API for a programmer.
find_order_by_customer, not GET /orders with fourteen optional query parameters.A tool designed for a model:
server.registerTool(
"find_orders",
{
title: "Find orders",
description: [
"Search for orders by customer, status, or date range.",
"",
"Use this when you do NOT already know the order ID. If you have an order ID,",
"use `get_order` instead — it is faster and returns the full detail including",
"line items and refund history.",
"",
"At least one filter is required. Returns up to 20 matches, most recent first,",
"with only the order ID, status, total, and customer email. Call `get_order`",
"with an ID from these results to see more.",
].join("\n"),
inputSchema: {
customerEmail: z.string().email().optional()
.describe("Exact email address. Partial matches are not supported."),
status: z.enum(["open", "paid", "shipped", "cancelled"]).optional()
.describe("Exact status. Use 'open' for orders not yet paid."),
placedAfter: z.string().date().optional()
.describe("ISO date (YYYY-MM-DD). Orders placed on or after this date."),
},
},
async ({ customerEmail, status, placedAfter }, { authInfo }) => {
if (!customerEmail && !status && !placedAfter) {
return {
isError: true,
content: [{
type: "text",
// Instructive, not merely accurate. The model can fix this on the next turn.
text: "At least one filter is required. Provide customerEmail, status, or placedAfter.",
}],
};
}
// Authorization is enforced here, against the authenticated principal —
// never against what the model claims.
const orders = await db.orders.search({
tenantId: authInfo.tenantId,
customerEmail, status, placedAfter,
limit: 20,
});
if (orders.length === 0) {
return { content: [{ type: "text",
text: "No orders matched. Try widening the date range or removing the status filter." }] };
}
// Compact: four fields per row, not the full object graph.
return {
content: [{
type: "text",
text: orders
.map((o) => `${o.id} | ${o.status} | ${(o.totalCents / 100).toFixed(2)} ${o.currency} | ${o.customerEmail}`)
.join("\n"),
}],
};
},
);
Resources for context the model should read, not call:
// A resource is read-only context the client can attach. Modeling this as a
// tool would force the model to spend a turn asking for something it always needs.
server.registerResource(
"order-schema",
"schema://orders",
{ title: "Order schema", mimeType: "text/markdown" },
async () => ({
contents: [{ uri: "schema://orders", text: await readFile("docs/order-schema.md") }],
}),
);
Frequently asked questions
Covers tool, resource, and prompt design, transport choice, authentication, error handling, and testing an MCP server against a real client.
The source record exposes this install command: npx skills add https://github.com/nimadorostkar/Claude-Skills-collection --skill "skills/ai/mcp-server". Inspect the command and pinned source before running it.
Static rules flagged read-files in the source; the page lists the matching lines and excerpts.
Alternatives
prowler-cloud/prowler
PostgreSQL indexing best practices for Prowler: index design, partial indexes, partitioned table indexing, EXPLAIN ANALYZE validation, concurrent operations, monitoring, and maintenance. Trigger: When creating or modifying PostgreSQL indexes, analyzing query performance with EXPLAIN, debugging slow queries, reviewing index usage statistics, reindexing, dropping indexes, or working with partitioned table indexes. Also trigger when discussing index strategies, partial indexes, or index maintenance
vasilyu1983/AI-Agents-public
Guides iOS testing with XCTest, XCUITest, Swift Testing, simctl, and xcresult. Use when choosing destinations, controlling flakes, or parsing test artifacts for native apps.
Postpartum-genushyacinthus29/dotnet-skills
Implement the Model-View-ViewModel pattern in .NET applications with proper separation of concerns, data binding, commands, and testable ViewModels using MVVM Toolkit.
yonatangross/orchestkit
Grade work that already exists and decide whether it can merge. Runs the project's current unit, integration, and E2E suites plus security scanning and type checking, scores every dimension 0-10, and returns a merge verdict with a VERIFIED-vs-CLAIMED evidence manifest. Writes no test files and edits no source. Use when verifying changes are ready to merge. Use /ork:cover instead when the tests still have to be written.