mcp-ovh-api
@mgcrea/mcp-ovh-api
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=1fügt die Schreibwerkzeuge hinzu; die destruktiven erfordern dann zusätzlich bei jedem Aufruf ein explizitesconfirm: 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-QueryIDwird 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 buildKonfigurieren
Wählen Sie eine Authentifizierungsmethode.
(A) OAuth2-Dienstkonto – empfohlen
Erstellen Sie ein IAM-Dienstkonto unter https://www.ovh.com/manager/#/iam/service-account.
Weisen Sie ihm eine IAM-Richtlinie zu, die Ihrem Public-Cloud-Projekt Zugriff gewährt (für Object Storage:
publicCloudProject:apiovh:*auf die Projektressource).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 /meAnfragen 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 .envVariable | Erforderlich | Beschreibung |
| nein |
|
| (A) | IAM-Dienstkonto. Deren Vorhandensein wählt OAuth2. |
| (B) | Anwendungsschlüsselpaar. |
| (B) | Dazu ausgestellter Consumer-Key. |
| (C) | Vorab erstelltes Bearer-Token. |
| nein | Erzwingt |
| nein | Standardprojekt – die 32-stellige Hex- |
| nein | Standard-Speicherregion, in Großbuchstaben ( |
| nein | Auf |
| nein | Überschreibt die API-Basis-URL vollständig. |
| nein | Wiederholungsbudget für 401 / 429 / 5xx. Standard: |
| nein | OAuth2-Token so lange vor Ablauf erneuern. Standard: |
| nein | Auf |
Ausführen
pnpm start # speaks JSON-RPC over stdioIn 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.jsWissenswerte Fallstricke
Alle sind in die Werkzeugbeschreibungen eingearbeitet, aber sie erklären die Form dieses Servers:
**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.
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_userprüft dieownerIddes Buckets und verweigert, wenn Sie auf den Besitzer zeigen.Derselbe Rückfall gilt pro Objekt. Wer ein Objekt hochlädt, besitzt es und erhält
FULL_CONTROLdarauf über die Objekt-ACL. Das bloße Weglassen vons3:GetObjectverhindert 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 explizitesDenyist erforderlich, und es schlägt die ACL. Deshalb liefert diewrite-only-Voreinstellung eineDeny-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 |
|
Buckets |
|
Objekte |
|
Benutzer & Schlüssel |
|
Richtlinien |
|
Notausgang |
|
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 |
| Erlaube |
|
|
| beides, plus |
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=trueDas 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 # 403Die 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 formatLizenz
MIT
Available Tools
1 toolovh_auth_statusOVHcloud: Auth StatusARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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
With only one tool, there is no possibility of confusion between tools. The single tool's purpose is clearly defined and distinct.
The lone tool name follows a clean snake_case verb_noun pattern. With only one tool, there are no inconsistencies to evaluate.
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.
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
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
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Governed MCP gateway: one endpoint for your tools, with credential custody and audit log.
Read-only MCP server for AIStatusDashboard status, incidents, metrics, and fallback recommendations.
MCP server for Product Management
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for AWS S3 — list buckets, browse objects, upload/download files, and generate presigned URLs.7904MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for uploading, listing, and retrieving files on S3-compatible storage (AWS S3, DigitalOcean Spaces) with public/private access and temporary URLs.15MIT
- FlicenseNot gradedqualityCmaintenanceRead-only MCP server for browsing and reading S3 objects, with tools for listing buckets/objects, reading text and binary files, and extracting text from PDFs.
- AlicenseAqualityDmaintenanceMCP 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.2367MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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