---
title: "MCP Server Development for Products & Internal Tools"
canonical: https://wavect.io/services/mcp-server-development/
language: en
description: "Wavect builds MCP servers that let AI agents use your product or internal tools: tool design, OAuth, scoped permissions, versioning and tests with real MCP clients."
image: "https://wavect.io/img/general/bak/open_graph_preview.jpg"
---

MCP Servers

# MCP servers that let agents use your product, within the limits you set.

An AI agent can only do what your tools allow. We design the tools, wire them to your identity provider, scope what each caller may read and change, and test the server with the MCP clients your users actually run.

THE ENGAGEMENT

## Design the tools. Bound the access. Test with real clients.

1. **Choose the actions** Which reads and writes an agent needs, and which it never gets.
2. **Build the server** Tools, authorization, tenancy and error handling in your stack.
3. **Verify and hand over** Client tests, a versioning policy and operating notes.

DIRECT ANSWER

MCP server development exposes your product or internal tools to AI agents through the Model Context Protocol. This engagement covers tool design, authorization, permission scoping, versioning and tests with real MCP clients, delivered as code in your repository.

Best for

- SaaS teams whose customers want to use the product from Claude, ChatGPT, Cursor or their own agents
- Companies that want internal agents to act on internal systems with bounded permissions

Consider another approach

- Syncing records between two business systems without an agent in the loop
- An independent abuse and permission test of an MCP server that already exists

## An agent interface, not another integration

This service builds the interface an AI agent calls. Moving records between two business systems on a schedule or event belongs to [API Integration](/services/api-integration/). An independent permission and abuse test of the finished server belongs to [AI Security](/services/ai-security/). The agent product itself, its prompts, models and user experience, belongs to [AI Agents & Products](/services/artificial-intelligence/). If you are still choosing between MCP, retrieval or agent skills, read [MCP vs RAG vs Agent Skills](/blog/mcp-vs-rag-vs-agent-skills-vs-custom-gpts/) first.

## Design tools around outcomes the agent can verify

A tool is a contract a model reads. Names, descriptions, input schemas and error messages decide whether an agent calls it correctly. Fewer, well-bounded tools beat a mirror of every API endpoint.

Read and write separated

Read-only tools stay separate from tools that change data, spend money or contact people. Destructive actions need confirmation or a narrower scope.

Schemas and errors

Typed inputs, bounded result sizes and errors that tell the agent what to change, not a stack trace.

Explicit application state

Baskets, approvals and long-running jobs get their own IDs and storage, so any server instance can handle the next request.

Discovery metadata

A server card and tool annotations so clients and reviewers can see what the server offers before they connect.

## Authorization through your identity provider, scoped per caller

Under the current MCP specification, a remote server is an OAuth 2.1 resource server: it validates tokens issued by your identity provider rather than running its own login. Tokens are bound to the server as audience and are never passed through to downstream APIs. Local STDIO servers take credentials from their environment instead. The [enterprise MCP authorization architecture](/blog/enterprise-mcp-authorization-architecture/) shows the multi-tenant design we start from. Data-level checks stay in your backend, because the protocol alone is [not a security boundary](/blog/mcp-security-boundary-data-level-access-control/).

## Versioning that survives protocol and product changes

MCP revision 2026-07-28 made the protocol stateless: no initialize handshake, no session header, and every request carries the protocol version and client capabilities it needs. We build to the revision your target clients support, keep tool changes backward compatible where possible and document what breaks when it cannot be avoided. The [stateless MCP migration guide](/blog/mcp-stateless-server-migration-2026/) covers the transport changes in detail.

## Design, build and test with real clients

Each phase is scoped and quoted before work starts. You can take the design to your own team or commission the agreed implementation.

1. **Tool and access design** - The list of tools, their inputs and outputs, required scopes, tenancy model and the actions that stay out of reach.
2. **Implementation and client tests** - The server in your repository, automated tests and recorded runs with the MCP clients agreed in scope.
3. **Continued development** - New tools, protocol updates and client changes, agreed separately. This does not create 24/7 coverage or an uptime SLA.

## We run our own MCP server in production

Wavect operates a public MCP endpoint at wavect.io/mcp on the stateless 2026-07-28 revision. Read-only tools for services and case studies sit apart from purchase actions, which are hidden unless commerce is enabled and require an explicit payment step. We also publish the free [MCP Install Risk Scanner](/tools/mcp-install-risk-scanner/), which flags risky patterns in MCP install commands before anyone runs them. That is our own product, not a client delivery. [Our Trust Center](/trust-center/) explains delivery responsibilities and service levels.

// proof

## Adjacent engineering work

We have no published client MCP server case yet, and we do not claim one. Aniron documents adjacent work: Wavect was the main contributor to the developer portal of an AI inference API, covering API keys, prepaid credits, usage visibility and integrations. Our own production MCP endpoint is described above. Neither is a promise of the same result for another system.

### [Aniron](/case-studies/aniron/)
- **Status:** Live
- **Outcome:** Developer portal - Customer onboarding, API-key controls, prepaid-credit top-ups and usage visibility delivered.
- **Summary:** Wavect was the main contributor to Aniron's developer application, covering API keys, prepaid credits, usage visibility and …
- **Stack:** TypeScript, Next.js, React

These are selected projects, not our full portfolio. We have shipped 100+ products since 2018.

## Questions before you start

### Do we need MCP, or is our REST API enough?

If agents only need to call a few endpoints from a single platform, function calling against your API may be enough. MCP pays off when several agent clients should use the same tools with consistent authorization and discovery.

### Remote or local server?

Remote servers over HTTP fit SaaS products and shared internal tools, with OAuth through your identity provider. Local STDIO servers fit developer tools that run on a user’s machine. We confirm the choice during scoping.

### Which MCP clients do you test with?

The clients your users run, agreed in the scope. Client support for protocol revisions and authorization differs, so the proposal names the clients and versions included.

### Can an agent delete data or spend money through the server?

Only if you decide it should. We keep such actions separate, narrowly scoped and confirmable, and enforce the permission in your backend, not only in the tool description.

### Is a security review included?

Authorization design and tests of the agreed scopes are part of the build. An independent abuse and permission test of the finished server is scoped separately as AI Security.

## Choose your next step

- [Connect business systems](/services/api-integration/)
- [Test agent permissions and abuse cases](/services/ai-security/)
- [Build an AI agent product](/services/artificial-intelligence/)

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/services/mcp-server-development/#service",
      "@type": "Service",
      "areaServed": [
        {
          "@type": "Country",
          "name": "Austria"
        },
        {
          "@type": "Place",
          "name": "Worldwide"
        }
      ],
      "category": "Artificial Intelligence",
      "dateModified": "2026-10-30",
      "description": "Wavect builds MCP servers that let AI agents use your product or internal tools: tool design, OAuth, scoped permissions, versioning and tests with real MCP clients.",
      "name": "MCP Server Development for Products & Internal Tools",
      "provider": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "serviceType": "MCP Server Development",
      "url": "https://wavect.io/services/mcp-server-development/"
    },
    {
      "@type": "BreadcrumbList",
      "itemListElement": [
        {
          "@type": "ListItem",
          "item": "https://wavect.io/",
          "name": "Home",
          "position": 1
        },
        {
          "@type": "ListItem",
          "item": "https://wavect.io/services/overview/",
          "name": "Services",
          "position": 2
        },
        {
          "@type": "ListItem",
          "item": "https://wavect.io/services/overview/#ai",
          "name": "Artificial Intelligence",
          "position": 3
        },
        {
          "@type": "ListItem",
          "item": "https://wavect.io/services/mcp-server-development/",
          "name": "MCP Server Development",
          "position": 4
        }
      ]
    },
    {
      "@id": "https://wavect.io/services/mcp-server-development/#webpage",
      "@type": "WebPage",
      "dateModified": "2026-10-30",
      "description": "Wavect builds MCP servers that let AI agents use your product or internal tools: tool design, OAuth, scoped permissions, versioning and tests with real MCP clients.",
      "inLanguage": "en",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "mainEntity": {
        "@id": "https://wavect.io/services/mcp-server-development/#service"
      },
      "name": "MCP Server Development for Products & Internal Tools",
      "url": "https://wavect.io/services/mcp-server-development/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "If agents only need to call a few endpoints from a single platform, function calling against your API may be enough. MCP pays off when several agent clients should use the same tools with consistent authorization and discovery."
      },
      "name": "Do we need MCP, or is our REST API enough?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Remote servers over HTTP fit SaaS products and shared internal tools, with OAuth through your identity provider. Local STDIO servers fit developer tools that run on a user's machine. We confirm the choice during scoping."
      },
      "name": "Remote or local server?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "The clients your users run, agreed in the scope. Client support for protocol revisions and authorization differs, so the proposal names the clients and versions included."
      },
      "name": "Which MCP clients do you test with?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Only if you decide it should. We keep such actions separate, narrowly scoped and confirmable, and enforce the permission in your backend, not only in the tool description."
      },
      "name": "Can an agent delete data or spend money through the server?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Authorization design and tests of the agreed scopes are part of the build. An independent abuse and permission test of the finished server is scoped separately as AI Security."
      },
      "name": "Is a security review included?"
    }
  ],
  "speakable": {
    "@type": "SpeakableSpecification",
    "cssSelector": [
      ".faq-question",
      ".faq-answer"
    ]
  }
}
```
