Le serveur MCP Hushscript connecte un assistant à vos enregistrements et transcriptions via le Model Context Protocol. Approuvez une connexion OAuth dans votre navigateur ou fournissez un jeton d’accès personnel. La transcription et les actions payantes suivent les règles de financement de votre compte personnel ou de votre espace de travail éligible.
Deux serveurs
Hushscript exploite deux serveurs MCP distincts, et la plupart des lecteurs n’ont besoin que d’un seul.
https://mcp.hushscript.com/mcp est le serveur de compte que décrit le
reste de cette page. Il accepte OAuth ou un jeton d’accès personnel, et permet les
actions sur le compte : téléverser, transcrire, modifier, exporter.
POST https://hushscript.com/mcp est un serveur de documentation gratuit et distinct.
Pas de compte, pas de jeton, aucune connexion nécessaire. Il est en lecture seule et
anonyme : il ne peut pas ouvrir de compte, lancer une transcription, ni
toucher à quoi que ce soit appartenant à un compte. Il répond aux questions
sur les tarifs, les capacités, le contenu des pages et la façon de se
connecter, via cinq outils (get_pricing, get_capabilities,
how_to_connect, list_pages, get_page) et les mêmes informations sous
forme de trois ressources (hushscript://pricing, hushscript://capabilities,
hushscript://connect).
Si vous êtes un agent qui vient de découvrir Hushscript, que vous ne détenez aucun jeton, et que vous décidez encore si le produit vous convient avant de dépenser quoi que ce soit, commencez par le serveur de documentation. Revenez au reste de cette page une fois prêt à connecter un compte.
Se connecter
Le serveur utilise Streamable HTTP sur un point de terminaison unique :
https://mcp.hushscript.com/mcp
Il n’y a pas de point de terminaison SSE, et aucun logiciel Hushscript à installer localement. Dans Claude Code :
claude mcp add --transport http hushscript https://mcp.hushscript.com/mcp
Dans un client qui accepte une configuration JSON :
{
"mcpServers": {
"hushscript": {
"type": "http",
"url": "https://mcp.hushscript.com/mcp"
}
}
}
Un client compatible OAuth lit /.well-known/oauth-authorization-server
pour découvrir les points de terminaison. Il peut s’enregistrer via
/oauth/register ou utiliser un document de métadonnées d’identifiant client,
puis ouvre une fenêtre de navigateur pour la connexion.
Ce que vous approuvez
L’autorisation repose sur OAuth 2.1 avec PKCE. La fenêtre de navigateur est un écran de consentement Hushscript, pas un champ de mot de passe pour le client : elle nomme l’application qui fait la demande, énumère en langage clair ce qu’elle veut faire, et attend votre décision. Rien n’est accordé tant que vous ne l’avez pas approuvé là.
Les jetons d’accès sont valables une heure et les jetons de renouvellement, trente jours. Avec OAuth, votre client gère ces identifiants pour vous ; vous ne collez jamais de jeton d’accès personnel dans la configuration.
Sans navigateur
Une connexion OAuth nécessite une approbation dans le navigateur. Le même
serveur accepte aussi directement un jeton d’accès personnel, sans étape de
navigateur au moment de la connexion. Une personne en crée un sous Tokens sur la
page MCP du compte, choisit ses
scopes et décide s’il peut acheter des minutes. Le jeton est affiché une
seule fois, ressemble à hsr1:<region>:pat.<id>.<secret> et se place dans
Authorization: Bearer <token> à chaque requête : pas d’aller-retour OAuth,
pas d’écran de consentement, pas d’enregistrement de client. Le même jeton
fonctionne avec l’API REST.
Un jeton peut aussi appartenir à un compte machine sans titulaire humain.
Un agent démarre une inscription payante avec POST /v1/agent/accounts,
termine la page Stripe Checkout hébergée dans un navigateur qu’il peut
piloter et récupère le compte avec un secret à usage unique via
POST /v1/agent/accounts/{signup_id}/claim pour obtenir son premier jeton.
Ce jeton se connecte ici comme n’importe quel autre. Voir
Transcription automatique pour agents et scripts pour le parcours complet.
Un jeton ne peut pas créer, lister ni révoquer d’autres jetons. Un compte peut détenir au maximum 25 jetons actifs. Le premier jeton du compte machine peut effectuer sa propre rotation via l’API REST ; le parcours est décrit dans Transcription automatique pour agents et scripts.
Permissions
Une connexion dispose d’un ensemble de scopes. Une demande OAuth qui n’en
précise aucun reçoit par défaut dix des onze scopes sélectionnables par
l’appelant, tous sauf billing. Une personne choisit les scopes d’un jeton
créé dans l’application. Le premier jeton d’un compte machine dispose
uniquement de transcripts:read, transcripts:write, transcribe,
account:read, export, billing et du scope distinct pat:rotate pour sa
propre rotation. La récupération du compte active les deux réglages de
facturation ; un jeton créé par une personne nécessite leur activation
explicite. Lorsque les scopes sont connus, le serveur annonce les outils
correspondants ; le backend les vérifie à chaque appel.
| Scope | Autorisations |
|---|---|
transcripts:read |
Lire et exporter les transcriptions, leurs métadonnées et la liste des éléments supprimés |
transcripts:write |
Modifier, étiqueter, traduire, restaurer et supprimer des transcriptions |
transcribe |
Téléverser des enregistrements, importer depuis un lien et lancer des transcriptions |
insights |
Lire, générer et supprimer des Insights |
context |
Gérer les dictionnaires enregistrés et les modèles d’invite |
account:read |
Lire le solde, l’utilisation, les transactions et les réservations |
settings:write |
Modifier les paramètres du compte |
org:read |
Lire les membres de l’espace de travail, le registre, les factures et le journal d’audit |
org:write |
Modifier les droits des membres, placer et lever une conservation légale, et planifier le passage à la garde de l’organisation (permanente) |
export |
Demander un export complet du compte, vérifier son statut et le télécharger |
billing |
Enregistrer ou gérer des moyens de paiement et acheter des packs de minutes |
billing fait exception dans tous les cas. Il n’est jamais accordé
implicitement, l’écran de consentement vous avertit avant que vous ne
l’approuviez, et un outil d’achat nécessite l’activation de la facturation
sur le jeton et sur le compte. pat:rotate ne peut pas être sélectionné dans
une demande OAuth ni dans le formulaire de création de jeton de l’application.
Ce que couvrent les outils
56 outils, regroupés selon ce qu’ils touchent :
| Groupe | Outils | Exemples |
|---|---|---|
| Transcriptions, lecture | 4 | list_transcripts, get_transcript, list_deleted |
| Transcriptions, écriture | 10 | update_body, revert_body, retranslate, tag_transcripts |
| Transcription | 8 | create_upload, transcribe_from_url, list_jobs, cancel_job |
| Compte | 6 | get_balance, get_usage, list_transactions |
| Insights | 3 | get_insights, generate_insights, delete_insights |
| Export | 4 | export_transcript, request_account_export |
| Contexte de transcription | 5 | save_dictionary, save_prompt_preset |
| Espace de travail | 10 | get_org, list_org_members, get_org_audit_log, place_transcript_hold |
| Facturation | 6 | list_packs, purchase_pack, list_payment_methods, add_payment_method |
export_transcript renvoie TXT, SRT, VTT, Markdown ou JSON. L’ensemble
complet des 21 formats d’export se trouve dans l’application.
En plus des outils, le serveur publie trois ressources et une chaîne
instructions à la connexion : les packs de minutes, le modèle de crédits
et de scopes et le catalogue complet des codes d’erreur. Un client peut ainsi
lire les règles avant tout appel. Les outils de liste paginés acceptent un
limit et un cursor opaque tiré du next_cursor de la page précédente ;
list_packs et list_payment_methods renvoient leurs listes sans curseur.
Les téléversements MCP envoient de l’audio préparé. Pour une vidéo locale,
préparez d’abord l’audio sur votre appareil ; transcribe_from_url récupère
les liens audio pris en charge côté serveur et n’importe pas de liens vidéo.
Les tâches lancées via MCP utilisent le mode standard : leurs transcriptions
sont enregistrées selon la durée de conservation du compte. Le mode privé
ponctuel est disponible dans l’application, pas via les jetons MCP.
Exemples
Un client qui effectue le flux OAuth obtient une session MCP normale et ne voit jamais rien de cela directement : son SDK construit le JSON-RPC en coulisses. C’est le même protocole qu’un client muni d’un jeton envoie à la main, et cela sert d’aide au débogage dans les deux cas.
Connectez-vous avec un jeton en le plaçant directement sur la requête, sans
autre prise de contact que initialize :
curl -s https://mcp.hushscript.com/mcp \
-H "Authorization: Bearer hsr1:us:pat.4f2a1c.9e7b3d2a5c8f1e6b4a0d7c3f2e1b9a8d" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-06-18",
"capabilities": {},
"clientInfo": { "name": "example-client", "version": "1.0.0" }
}
}'
Envoyez à nouveau la même requête avec un corps différent pour voir tous les outils que couvrent les scopes du jeton :
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list"
}
Chaque entrée porte un nom, une description et un inputSchema au format
JSON Schema, correspondant aux groupes ci-dessus. Appeler un outil ressemble
à ceci, create_upload réservant du crédit et démarrant un téléversement :
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "create_upload",
"arguments": {
"size_bytes": 52428800,
"duration_seconds": 1800,
"title": "Team standup 2026-09-10",
"transcription_options": { "speaker_detection": true }
}
}
}
Les outils structurés comme create_upload renvoient un bloc de texte
content contenant du JSON sous forme de chaîne. Par exemple :
{
"content": [
{
"type": "text",
"text": "{\n \"job_id\": \"job_8f3a1c2b9e\",\n \"balance_seconds\": 5400,\n \"held_seconds\": 1800,\n \"upload\": {\n \"part_size_bytes\": 33554432,\n \"total_parts\": 2,\n \"part_urls\": [\n { \"n\": 1, \"url\": \"https://...\" }\n ],\n \"next_part_number\": 2\n }\n}"
}
]
}
La réponse ci-dessus montre les champs du téléversement ; la réponse complète
comprend aussi limits, funding et state. Téléversez les octets sur ces
URL, appelez complete_upload avec l’ETag de
chaque partie, puis interrogez get_job jusqu’à ce que son état soit
done. Les exemples ci-dessous montrent directement ce JSON interne, déjà
analysé, et omettent l’enveloppe {"jsonrpc":"2.0","id":...} autour de la
requête puisqu’elle ne change jamais : seuls name et arguments varient.
export_transcript renvoie le format rendu sous forme de texte, et
download_account_export_chunk renvoie les octets bruts encodés en base64.
Analysez le text d’un résultat comme du JSON uniquement lorsque l’outil
renvoie des données structurées.
Lister et lire des transcriptions :
{
"name": "list_transcripts",
"arguments": { "limit": 5 }
}
{
"transcripts": [
{
"id": "t_9c2b7f10",
"title": "Team standup 2026-09-10",
"language_detected": "en",
"duration_seconds": 1800,
"tags": ["standup"],
"insights_state": "none"
}
],
"next_cursor": null
}
Générer Insights, gratuitement lors du premier appel pour une transcription.
Cet exemple montre le solde après le début d’une nouvelle génération ;
reused vaut false :
{
"name": "generate_insights",
"arguments": { "id": "t_9c2b7f10" }
}
{
"ok": true,
"reused": false,
"balance_seconds": 5400,
"held_seconds": 0
}
Acheter des minutes, idempotency_key est obligatoire afin qu’une nouvelle
tentative après une réponse perdue ne puisse pas facturer deux fois :
{
"name": "purchase_pack",
"arguments": {
"pack": "300min",
"payment_method_id": "pm_1PxYzABC",
"idempotency_key": "agent-2026-09-11-refill-01"
}
}
{
"status": "ok",
"balance_seconds": 23400
}
Les ressources répondent sans appel d’outil, resources/read nommant l’une
des trois URI :
{
"jsonrpc": "2.0",
"id": 9,
"method": "resources/read",
"params": { "uri": "hushscript://pricing" }
}
Réponse abrégée (la note explicative de la ressource est omise) :
{
"contents": [
{
"uri": "hushscript://pricing",
"mimeType": "application/json",
"text": "{\"packs\":[{\"id\":\"45min\",\"minutes\":45},{\"id\":\"300min\",\"minutes\":300},{\"id\":\"900min\",\"minutes\":900},{\"id\":\"1800min\",\"minutes\":1800},{\"id\":\"6000min\",\"minutes\":6000}]}"
}
]
}
Utilisez list_packs pour connaître les montants et les devises actuels des packs.
Chaque échec côté serveur porte un slug stable et un code numérique, le même
corps {"error": "<slug>", "code": <number>} documenté dans
hushscript://error-codes. Un appel d’outil fait remonter ce même slug et
ce même code, intégrés dans un message lisible plutôt que dans un objet
d’erreur brut, et signale le résultat avec isError plutôt que de lever une
exception :
{
"content": [
{
"type": "text",
"text": "Not enough transcription credit. This job needs 1800 seconds and the balance is 900 seconds. Top up at https://app.hushscript.com/billing (insufficient_balance, E3001)"
}
],
"isError": true
}
Ce qui consomme des minutes
Lire les données du compte ne consomme pas de minutes de transcription. Les actions facturées suivent les mêmes tarifs que dans l’application. Elles utilisent généralement les minutes personnelles prépayées ; une transcription d’espace de travail peut utiliser une réserve Teams si la réserve active couvre à elle seule toute la tâche et qu’aucune langue de traduction cible n’est sélectionnée. Une tâche avec des langues de traduction cibles ou une URL audio importée utilise des minutes personnelles. Le financement ne change pas la garde des transcriptions.
Les comptes personnels éligibles reçoivent 30 minutes gratuites après vérification de carte ; un compte machine commence avec le pack acheté à l’inscription.
- Transcrire un enregistrement consomme des minutes selon sa durée. Le mode médical ajoute 100 %, et chaque langue de traduction cible ajoute 25 %. Avec le mode multicanal activé, chaque canal audio est facturé séparément, donc un fichier stéréo compte double.
- Insights : la première génération par transcription est gratuite. Une régénération coûte 40 % de la durée de l’enregistrement depuis la transcription originale, ou 30 % depuis une version nettoyée. Elle utilise les minutes personnelles du membre, même si une réserve d’espace de travail a financé la transcription.
- Retraduire une transcription coûte 25 % de sa durée par langue et écrase la traduction existante : chaque langue facturée par l’appel perd toute copie modifiée à la main de cette traduction, sans possibilité de la récupérer.
purchase_packdébite immédiatement une carte enregistrée éligible si l’achat réussit. Il exige le scopebillinget l’activation de la facturation sur le jeton et sur le compte. Il ajoute des minutes au solde personnel, pas à une réserve Teams.add_payment_methodne coûte rien. Il renvoie un lien Stripe Checkout qui enregistre une carte sur le compte sans la débiter ; terminez le parcours une fois dans un navigateur (un agent peut piloter le sien). Ensuite,purchase_packtente un paiement hors session ; un refus ou une demande d’authentification de l’émetteur renvoie un code d’erreur distinct plutôt qu’une page inachevée.
Voir tarifs pour les packs eux-mêmes.
Consulter et révoquer
Pour un compte auquel vous pouvez vous connecter, les connexions OAuth apparaissent sous Applications connectées sur la page MCP de votre compte, avec leur client et leurs scopes. Les jetons y sont aussi listés ; en révoquer un interrompt ses appels. Supprimer la configuration d’un client empêche uniquement ce client d’envoyer des requêtes. Un compte machine ne dispose pas d’une boîte e-mail de connexion utilisable ; son jeton effectue sa propre rotation via le parcours de compte d’agent.
Limites
Les jetons de comptes humains autorisent chacun 1 200 requêtes par minute.
Les jetons successifs d’un compte d’agent partagent ce budget à travers les
rotations. Les routes de facturation qui appellent Stripe via un jeton
partagent une limite de 60 requêtes par minute et par compte : configuration
de carte, achat, changement de carte par défaut, suppression de carte et
requêtes de liste des cartes non servies par le cache. Les achats de comptes
d’agents et les achats avec un jeton de compte humain sont plafonnés à trois
tentatives par période glissante de 24 heures et par compte. L’inscription
payante de l’agent compte, tout comme les échecs après réservation d’une
tentative ; les achats humains depuis une session de navigateur en sont
exemptés. Un refus dû au plafond renvoie HTTP 429 / code 4038
agent_purchase_capped, distinct de la limitation ordinaire HTTP 429 / code
5000 rate_limited. Les deux fournissent Retry-After.
L’autorisation OAuth et sa finalisation partagent une limite de 30 requêtes
par minute et par adresse. L’enregistrement a sa propre limite de 30 par
minute ; /oauth/token a une limite distincte de 600 par minute. Chacune
utilise une adresse IPv4 ou un préfixe IPv6 /64 comme clé. Les requêtes de
validation de jetons bruts non servies par le cache ont une autre limite de
30 par minute sur la même clé ; elle ne s’applique pas à chaque appel d’outil MCP.