Skip to main content
Glama
mgcrea

mcp-ovh-api

by mgcrea

@mgcrea/mcp-ovh-api

npm version GHCR

Ein Model Context Protocol-Server für die OVHcloud-API, fokussiert auf Object Storage: Buckets, Objekte, Projektbenutzer, S3-Zugangsdaten und die Speicherrichtlinien, die sie zusammenhalten.

Der Server ist standardmäßig schreibgeschützt. Mutierende Werkzeuge werden nicht nur verweigert, wenn Schreibzugriff deaktiviert ist – sie werden nie registriert, sodass ein Agent sie überhaupt nicht aufrufen kann.

Funktionen

  • Kuratierte Werkzeuge über die /1.0-API von OVHcloud mit Beschreibungen, die deren Fallstricke ausführen (siehe Wissenswerte Fallstricke).

  • Standardmäßig schreibgeschützt. OVH_ALLOW_WRITES=1 fügt die Schreibwerkzeuge hinzu; die destruktiven erfordern dann zusätzlich bei jedem Aufruf ein explizites confirm: true.

  • Alle drei OVH-Authentifizierungsmethoden, automatisch ausgewählt anhand der vorhandenen Umgebungsvariablen: OAuth2-Dienstkonto (empfohlen), Anwendungsschlüssel + Consumer-Key (SHA1-signiert, mit automatischer Korrektur der Uhrzeitabweichung) oder ein statisches Zugriffstoken.

  • Richtlinienvoreinstellungen – einschließlich write-only, das OVHs eigene Rollenabkürzung nicht bietet.

  • Listenergebnisse werden zusammengefasst, und OVHs veraltetes, pro-Bucket-objects[]-Array (das jedes Objekt im Bucket einbettet) wird auf beiden Seiten unterdrückt.

  • X-Ovh-QueryID wird bei jedem Fehler angezeigt, weil das das Erste ist, wonach der OVH-Support fragt.

  • Ein ovh_request-Notausgang für den Rest der API (nur GET, sofern Schreibzugriff nicht aktiviert ist).

  • Natives fetch, keine Laufzeitabhängigkeiten außer dem MCP-SDK und Zod.

Related MCP server: saveformedearai

Installieren

pnpm install
pnpm build

Konfigurieren

Wählen Sie eine Authentifizierungsmethode.

(A) OAuth2-Dienstkonto – empfohlen

  1. Erstellen Sie ein IAM-Dienstkonto unter https://www.ovh.com/manager/#/iam/service-account.

  2. Weisen Sie ihm eine IAM-Richtlinie zu, die Ihrem Public-Cloud-Projekt Zugriff gewährt (für Object Storage: publicCloudProject:apiovh:* auf die Projektressource).

  3. Kopieren Sie Client-ID und Secret in .env.

Tokens gelten eine Stunde und werden vor Ablauf zwischengespeichert und erneuert.

(B) Anwendungsschlüssel + Consumer-Key

Erstellen Sie das Trio in einem Schritt unter https://eu.api.ovh.com/createToken/. Die dort aufgeführten Zugriffsregeln sind für immer festgelegt – ein Consumer-Key kann später nicht erweitert werden. Gewähren Sie also von vornherein, was Sie benötigen:

GET    /cloud/project/*
POST   /cloud/project/*
PUT    /cloud/project/*
DELETE /cloud/project/*
GET    /me

Anfragen werden mit SHA1 über secret+consumerKey+METHOD+URL+BODY+TIMESTAMP signiert. Eine Uhr, die mehr als ~30s von OVH abweicht, lässt jeden Aufruf mit einem irreführenden Invalid signature fehlschlagen. Der Server prüft daher beim Start einmal /auth/time und korrigiert die Abweichung.

(C) Statisches Zugriffstoken

Setzen Sie OVH_ACCESS_TOKEN, und es wird als Authorization: Bearer gesendet.

cp .env.example .env

Variable

Erforderlich

Beschreibung

OVH_ENDPOINT

nein

ovh-eu (Standard), ovh-ca, ovh-us, kimsufi-*, soyoustart-*.

OVH_CLIENT_ID / OVH_CLIENT_SECRET

(A)

IAM-Dienstkonto. Deren Vorhandensein wählt OAuth2.

OVH_APPLICATION_KEY / _SECRET

(B)

Anwendungsschlüsselpaar.

OVH_CONSUMER_KEY

(B)

Dazu ausgestellter Consumer-Key.

OVH_ACCESS_TOKEN

(C)

Vorab erstelltes Bearer-Token.

OVH_AUTH_METHOD

nein

Erzwingt oauth2, signature oder accessToken. Andernfalls abgeleitet.

OVH_CLOUD_PROJECT

nein

Standardprojekt – die 32-stellige Hex-serviceName, nicht der Anzeigename.

OVH_REGION

nein

Standard-Speicherregion, in Großbuchstaben (GRA, SBG, DE, UK).

OVH_ALLOW_WRITES

nein

Auf 1 setzen, um die Schreibwerkzeuge zu registrieren. Standardmäßig aus.

OVH_API_URL

nein

Überschreibt die API-Basis-URL vollständig.

OVH_MAX_RETRIES

nein

Wiederholungsbudget für 401 / 429 / 5xx. Standard: 3.

OVH_REFRESH_SKEW_SECONDS

nein

OAuth2-Token so lange vor Ablauf erneuern. Standard: 60.

OVH_DEBUG

nein

Auf 1 setzen, um Debug-Ausgaben auf stderr zu protokollieren.

Ausführen

pnpm start   # speaks JSON-RPC over stdio

In Claude Code einbinden

Fügen Sie zu .mcp.json (Projekt) oder ~/.claude.json (global) hinzu:

{
  "mcpServers": {
    "ovh": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-ovh-api/dist/cli.js"],
      "env": {
        "OVH_CLIENT_ID": "...",
        "OVH_CLIENT_SECRET": "...",
        "OVH_CLOUD_PROJECT": "abcdef0123456789abcdef0123456789",
        "OVH_REGION": "UK"
      }
    }
  }
}

Werkzeuge anzeigen

npx @modelcontextprotocol/inspector node dist/cli.js

Wissenswerte Fallstricke

Alle sind in die Werkzeugbeschreibungen eingearbeitet, aber sie erklären die Form dieses Servers:

  1. **OVH hat keine Bucket-Richtlinien – nur Benutzerrichtlinien.** Ein rohes JSON-Dokument pro Projektbenutzer, und dieses Dokument ist die gesamte Zugriffskontrollfläche. Das Setzen einer Richtlinie ersetzt alles, was dieser Benutzer zuvor konnte, über alle Buckets hinweg.

  2. Eine Richtlinie kann den Besitzer des Buckets nicht einschränken. OVH fällt auf ACLs zurück, und der Besitzer hat FULL_CONTROL: „Wenn der Benutzer der Bucket-Besitzer ist und selbst wenn es keine explizite Erlaubnis in der Richtliniendatei gibt, wird der Benutzer autorisiert." Ein eingeschränkter Schlüssel muss daher zu einem neuen Projektbenutzer gehören, der den Bucket nicht erstellt hat. ovh_provision_s3_user prüft die ownerId des Buckets und verweigert, wenn Sie auf den Besitzer zeigen.

  3. Derselbe Rückfall gilt pro Objekt. Wer ein Objekt hochlädt, besitzt es und erhält FULL_CONTROL darauf über die Objekt-ACL. Das bloße Weglassen von s3:GetObject verhindert also nicht, dass ein Nur-Upload-Schlüssel alles zurücklesen kann, was er geschrieben hat – verifiziert gegen die Live-API, wo eine bloße Allow-List-Richtlinie dem Schlüssel problemlos seine eigenen Uploads auslieferte, während sie korrekt jedes Objekt verweigerte, das jemand anderes hochgeladen hatte. Ein explizites Deny ist erforderlich, und es schlägt die ACL. Deshalb liefert die write-only-Voreinstellung eine Deny-Anweisung statt einer bloßen Allow-List.

Zwei kleinere. s3:PutObject allein erlaubt weiterhin blindes Überschreiben vorhandener Schlüssel innerhalb des erlaubten Präfixes – ein „write-only"-Schlüssel ist kein Append-only-Schlüssel, was ein guter Grund ist, Versionierung auf dem Bucket zu aktivieren. Und Richtlinienänderungen brauchen bis zu ~30 Sekunden, um sich auszubreiten: Ein Testlauf fünf Sekunden nach ovh_set_storage_policy zeigt noch das alte Verhalten, was sich genau wie eine still fehlgeschlagene Richtlinie liest.

Werkzeuge

Jedes projektbezogene Werkzeug akzeptiert ein optionales project, und jedes Speicherwerkzeug eine optionale region, die OVH_CLOUD_PROJECT / OVH_REGION pro Aufruf überschreiben. Mit W markierte Werkzeuge existieren nur, wenn OVH_ALLOW_WRITES=1; mit ⚠️ markierte sind destruktiv und erfordern zusätzlich confirm: true.

Beginnen Sie mit ovh_whoami. Es meldet, welche Authentifizierungsmethode aktiv ist, welches Konto Sie sind und die Uhrzeitabweichung gegenüber OVH – worum es bei einem 401 bei der Signaturmethode fast immer geht.

Bereich

Werkzeuge

Meta

ovh_whoami, ovh_list_projects, ovh_get_project, ovh_list_regions, ovh_get_region

Buckets

ovh_list_buckets, ovh_get_bucket, ovh_get_bucket_lifecycle · W ovh_create_bucket, ovh_update_bucket, ovh_set_bucket_lifecycle, ⚠️ ovh_delete_bucket_lifecycle, ⚠️ ovh_delete_bucket

Objekte

ovh_list_objects, ovh_get_object, ovh_list_object_versions, ovh_presign_object · W ovh_copy_object, ⚠️ ovh_delete_object, ⚠️ ovh_delete_object_version, ⚠️ ovh_bulk_delete_objects

Benutzer & Schlüssel

ovh_list_project_users, ovh_get_project_user, ovh_list_s3_credentials · W ovh_create_project_user, ovh_create_s3_credentials, ovh_reveal_s3_secret, ⚠️ ovh_delete_s3_credentials, ⚠️ ovh_delete_project_user

Richtlinien

ovh_get_storage_policy, ovh_preview_policy · W ⚠️ ovh_set_storage_policy, ⚠️ ovh_grant_bucket_access, ⚠️ ovh_provision_s3_user

Notausgang

ovh_request – jeder /1.0-Pfad, nur GET, sofern Schreibzugriff nicht aktiviert ist

ovh_presign_object ist der einzige Weg, auf den Bytes bewegt werden: Der Server proxyt nie Objektinhalte, sondern erstellt stattdessen eine zeitlich begrenzte vorsignierte S3-URL. Bei deaktiviertem Schreibzugriff signiert er nur GET.

Richtlinienvoreinstellungen

ovh_preview_policy, ovh_set_storage_policy und ovh_provision_s3_user teilen drei Voreinstellungen, alle auf einen Schlüsselpräfix eingrenzbar:

Voreinstellung

Gewährte Berechtigungen

write-only

Erlaube s3:PutObject, s3:AbortMultipartUpload, s3:ListMultipartUploadParts auf dem Präfix – plus ein explizites Deny auf s3:GetObject / s3:GetObjectAcl bucketweit

read-only

s3:ListBucket + s3:GetBucketLocation auf dem Bucket, s3:GetObject auf den Objekten

read-write

beides, plus s3:DeleteObject

OVHs eingebaute Rollen (admin, deny, readOnly, readWrite, über ovh_grant_bucket_access) haben kein write-only-Äquivalent – deshalb existiert der Rohrichtlinien-Pfad. Das Multipart-Paar ist absichtlich enthalten: Jedes S3-SDK wechselt oberhalb von ~8-16MB automatisch zu Multipart, und ohne abort/list verwaist ein fehlgeschlagener Upload Teile, die der Schlüsselinhaber nicht aufräumen kann und weiterhin bezahlt.

OVH validiert Richtlinienaktionen gegen eine feste Enumeration und lehnt das gesamte Dokument mit einem 400 ab, wenn eine unbekannt ist – s3:GetObjectVersion und s3:DeleteObjectVersion existieren in AWS, aber nicht dort. Die Voreinstellungen verwenden nur akzeptierte Aktionen, und ein Test fixiert das.

Ausgabe eines Write-only-Upload-Schlüssels

Der motivierende Fall: Eine App bettet einen S3-Schlüssel in ein ausgeliefertes Binärprogramm ein, sodass der Schlüssel nur hochladen und sonst nichts können darf, während der Lese-/Schreibschlüssel beim Entwickler bleibt.

ovh_get_bucket           bucket=dev-rgis-ar          → note ownerId
ovh_preview_policy       bucket=dev-rgis-ar preset=write-only prefix=uploads/
ovh_provision_s3_user    bucket=dev-rgis-ar preset=write-only prefix=uploads/ \
                         description=ar-app-uploader confirm=true

Das erstellt einen neuen Projektbenutzer (niemals den Bucket-Besitzer), wendet die Richtlinie an und erstellt erst dann Zugangsdaten – ein Schlüssel, der vor seiner Richtlinie existiert, ist ein Schlüssel, der kurzzeitig hatte, was die Standardeinstellung erlaubt. Das Secret wird einmal zurückgegeben.

Verifizieren Sie gegen die echte S3-API, bevor Sie ihn übergeben – eine Richtlinie, die korrekt liest, kann immer noch durch Eigentum überschattet werden, und warten Sie ~30s nach dem Setzen, sonst testen Sie die vorherige Richtlinie:

export AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=...
# An array, not a string: zsh does not word-split an unquoted $var, so the
# `S3='aws ...'` form you would write in bash silently becomes "command not found".
S3=(aws --endpoint-url https://s3.uk.io.cloud.ovh.net --region uk s3api)
"${S3[@]}" put-object      --bucket dev-rgis-ar --key uploads/probe.txt --body /dev/null   # 200
"${S3[@]}" get-object      --bucket dev-rgis-ar --key uploads/probe.txt /dev/null          # 403
"${S3[@]}" list-objects-v2 --bucket dev-rgis-ar                                            # 403
"${S3[@]}" delete-object   --bucket dev-rgis-ar --key uploads/probe.txt                    # 403
"${S3[@]}" put-object      --bucket dev-rgis-ar --key elsewhere/probe.txt --body /dev/null # 403

Die get-object-Zeile ist die, die zählt: Sie ist die Prüfung, die Fallstrick 3 abfängt, und sie besteht nur wegen des Deny der Voreinstellung.

Entwickeln

pnpm dev            # tsdown --watch
pnpm test           # vitest
pnpm typecheck
pnpm lint
pnpm format

Lizenz

MIT

Available Tools

1 tool
ovh_auth_statusOVHcloud: Auth StatusA
Read-only

Report whether this server has working OVHcloud credentials, which auth method and endpoint it uses, the default project and region, whether writes are enabled, and — when something is missing — exactly what to set. Call this first when a tool you expected is not listed: an absent tool here means missing configuration, not a bug.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

The readOnlyHint annotation already marks this as safe, and the description adds useful behavioral context by stating it reports credential validity, auth method, endpoint, project/region, and write status. It also says missing credentials explain absent tools, which clarifies what the status check means. It doesn't explicitly describe network/read behavior, but the annotation plus 'report' wording make the safety profile clear.

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?

Two sentences carry a full purpose statement, a detailed list of outputs, and a usage rule. The key diagnostic trigger ('Call this first when a tool you expected is not listed') is placed second and is memorable. No word is wasted.

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

Completeness5/5

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

For a tool with no parameters, no siblings, and no output schema, the description is self-sufficient: it tells the agent what information the tool produces and when to invoke it. The only omitted detail, the exact configuration values to set, is precisely what the tool's output is described as providing.

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?

There are zero parameters, so there is nothing to document beyond the empty schema. The description still clarifies the kind of status data returned, which is consistent with a no-input diagnostic tool. Baseline 4 is appropriate for a 0-parameter 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 opens with a specific verb and resource: 'Report whether this server has working OVHcloud credentials,' then enumerates exactly what is reported (auth method, endpoint, default project/region, write enablement). This is unambiguous and fully distinguishes the tool from any conceivable alternative, even though no siblings are listed.

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

Usage Guidelines5/5

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

It gives an explicit call heuristic: 'Call this first when a tool you expected is not listed,' and even frames the diagnostic interpretation ('an absent tool here means missing configuration, not a bug'). This tells an agent not only when to run it but how to interpret the result.

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

TDQS

A4.2/5.0
Disambiguation5/5

With only one tool, there is no possibility of confusion between tools. The single tool's purpose is clearly defined and distinct.

Naming Consistency5/5

The lone tool name follows a clean snake_case verb_noun pattern. With only one tool, there are no inconsistencies to evaluate.

Tool Count1/5

A single status-check tool is drastically insufficient for a server named 'mcp-ovh-api' covering the OVH cloud API. The count represents an extreme mismatch between the server's implied scope and its actual surface.

Completeness1/5

The server exposes no operations beyond an authentication status check. Any actual OVH API functionality is absent, making the tool surface severely incomplete for the stated domain.

Maintenance

ActivityMaintained
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

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for uploading, listing, and retrieving files on S3-compatible storage (AWS S3, DigitalOcean Spaces) with public/private access and temporary URLs.
    15
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP server for Oracle Cloud Infrastructure (OCI) that provides tools to manage Compute, Object Storage, Block Storage, Networking, Autonomous Database, and IAM via the official OCI SDK.
    23
    67
    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/mgcrea/mcp-ovh'

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