Tohru — guide d'utilisation
Tohru est un assistant conversationnel pour Mac, iPhone, iPad et iPhone Duo. Il répond avec Apple Intelligence (modèle serveur Private Cloud Compute) dès l'installation, ou avec votre propre modèle désigné par son URL, et il peut utiliser les outils de vos serveurs MCP (Model Context Protocol).
- Premier lancement
- Choisir le cerveau
- Utiliser votre propre modèle (URL d'inférence)
- Donner des outils à Tohru : les serveurs MCP
- Confirmation des actions
- Pièces jointes, dictée, voix
- Dépannage
- Confidentialité
1. Premier lancement
Rien à configurer : posez votre question. Tohru utilise Apple Intelligence (Private Cloud Compute).
Conditions : un appareil compatible avec Apple Intelligence, Apple Intelligence activée (Réglages › Apple Intelligence et Siri), une connexion à Internet. Les requêtes sont décomptées du quota quotidien de votre compte iCloud ; l'état du quota s'affiche dans Réglages › Général et dans le panneau d'état (pastille en bas de la liste des conversations). La roue crantée ⚙︎ à côté ouvre les réglages ; la loupe, en haut à droite de la liste, cherche dans les conversations ; un balayage vers la gauche supprime une conversation.
2. Choisir le cerveau
Réglages › Général › Cerveau (Mac : menu Tohru › Réglages…, ⌘, ou roue crantée ⚙︎ ; iPhone et iPad : roue crantée ⚙︎ en bas de la liste des conversations). Le menu en bas de la liste des conversations permet aussi de basculer à tout moment.
| Cerveau | Quand le choisir |
|---|---|
| Apple Intelligence (Private Cloud Compute) | Par défaut : aucun réglage, contexte de 32 768 jetons. |
| Modèle compatible OpenAI (URL) | Modèle local (Ollama, LM Studio…) ou service en ligne : grand contexte, aucun quota Apple. |
Les deux cerveaux partagent les conversations, les outils MCP, la consigne système et la température (Réglages › Général). La consigne par défaut suit la langue de l'appareil ; « Rétablir la consigne par défaut » annule une consigne personnalisée.
3. Utiliser votre propre modèle (URL d'inférence)
Réglages › Modèle à URL :
| Champ | Exemple | Rôle |
|---|---|---|
| URL | http://192.168.1.20:11434/v1 |
Adresse de l'API compatible OpenAI, terminée en général par /v1. Tohru appelle …/chat/completions et …/models. |
| Modèle | qwen3:8b |
Nom du modèle. Le bouton Lister interroge …/models et propose les modèles du serveur. |
| Nom affiché | Ollama du salon |
Facultatif. |
| Clé | Facultative : envoyée en Authorization: Bearer, conservée dans le trousseau (synchronisé par iCloud), jamais dans un fichier. Inutile pour Ollama et LM Studio. |
|
| Compte du trousseau | inference |
Nom sous lequel la clé est rangée. |
| Contexte | 32768 |
Fenêtre annoncée du modèle, en jetons. |
| Réflexion | Réglage du serveur | Transmise en reasoning_effort (none, low, medium, high) aux modèles qui raisonnent. |
Enregistrer et utiliser ce modèle l'enregistre et le choisit comme cerveau ; Retirer revient à Apple Intelligence.
Adresses usuelles :
| Serveur | URL |
|---|---|
| Ollama | http://<adresse>:11434/v1 (sur le même Mac : http://localhost:11434/v1) |
| LM Studio | http://<adresse>:1234/v1 |
vLLM, llama.cpp (llama-server) |
http://<adresse>:8000/v1 (port selon votre lancement) |
| Service en ligne | l'URL de base « compatible OpenAI » du fournisseur, avec sa clé |
Le HTTP non chiffré n'est accepté que vers le réseau local (adresses privées,
.local) ; un service sur Internet doit être en HTTPS. Avec Ollama, exposez le serveur au réseau (OLLAMA_HOST=0.0.0.0) et réglez sa fenêtre de contexte (OLLAMA_CONTEXT_LENGTH).
4. Donner des outils à Tohru : les serveurs MCP
Un serveur MCP (Model Context Protocol) met des outils à la disposition de Tohru : rechercher dans une documentation, lire un dossier, piloter un service… Pour l'ajouter, son adresse suffit : Tohru découvre tout seul ses outils et, s'il est protégé, ouvre sa page de connexion. Il n'y a aucun fichier à écrire.
Tohru joint les serveurs MCP en HTTP « streamable » (adresse se terminant en général par /mcp).
Les serveurs « stdio », lancés en ligne de commande, ne sont pas joignables depuis un iPhone : leur
fournisseur doit les exposer en HTTP (par exemple avec mcp-proxy).
4.1 Ajouter un serveur par son adresse
Réglages › Serveurs MCP › Ajouter un serveur (Mac : menu Tohru › Réglages…, ⌘, ou roue crantée ⚙︎ ; iPhone et iPad : roue crantée ⚙︎ en bas de la liste des conversations › Serveurs MCP).
- Collez dans Adresse du serveur l'adresse que le fournisseur vous a donnée (
https://est ajouté s'il manque). - Touchez Se connecter. Tohru interroge le serveur et affiche ses outils ; le Nom est repris de celui que le serveur annonce, vous pouvez le changer. Selon la réponse du serveur, la fiche fait apparaître ce qu'il faut, et seulement cela :
- une page de connexion s'ouvre aussitôt (serveur protégé par OAuth, § 4.2) ;
- la section Jeton d'accès passe au premier plan (serveur à clé d'API, § 4.2) ;
- la section Certificat non reconnu affiche l'empreinte du certificat (serveur à certificat auto-signé, § 4.3).
- Touchez Enregistrer.
Pour un premier essai, Ajouter l'exemple DeepWiki ajoute un serveur public, sans compte, qui répond sur les dépôts GitHub publics. Demandez ensuite : « Avec DeepWiki, à quoi sert le dépôt modelcontextprotocol/swift-sdk ? »
La liste montre chaque serveur avec son état (nombre d'outils, ou erreur en orange) ; le toucher rouvre sa fiche. Supprimer ce serveur (en bas de la fiche ; sur iPhone et iPad, aussi par balayage dans la liste) le retire après confirmation.
4.2 Serveur qui demande de vous identifier
Pour un serveur protégé, Se connecter ouvre directement la page de connexion du fournisseur (compte, mot de passe, double authentification…), où Tohru se présente sous le nom Tohru AI. Une fois l'accès autorisé, vous revenez dans Tohru et les outils s'affichent :
- Tohru ne voit jamais votre mot de passe ; il reçoit un jeton d'accès limité à ce serveur, conservé dans le trousseau de cet appareil et renouvelé automatiquement (chaque appareil s'identifie une fois) ;
- S'identifier auprès du serveur… rouvre la page si vous l'avez fermée ; Se déconnecter de ce serveur efface l'autorisation.
Cette connexion suit la norme d'autorisation de MCP (OAuth 2.1 avec PKCE). Si le fournisseur vous a remis un identifiant client, saisissez-le dans Options avancées › Identifiant client OAuth ; sinon, Tohru s'identifie de lui-même.
Certains serveurs fournissent plutôt une clé d'API (jeton fixe) et répondent « 401 » sans publier de métadonnées OAuth. Après Se connecter, la fiche montre alors la section Jeton d'accès au premier plan, avec le message « Ce serveur demande un jeton d'accès : collez-le dans le champ « Jeton d'accès », puis « Se connecter ». » :
- touchez Coller dans la section Jeton d'accès : Tohru se connecte aussitôt (un jeton saisi au clavier, ou collé par ⌘V dans le champ, demande Se connecter) ; sur iPhone et iPad, un jeton copié sur le Mac arrive par le Presse-papiers universel ;
- touchez Enregistrer.
Le jeton est envoyé en Authorization: Bearer et conservé dans le trousseau ; il ne figure jamais
dans un fichier, un lien ou un code QR. Un jeton refusé affiche « Jeton refusé par le serveur (HTTP 401). »
Ne plus envoyer de jeton le retire. Pour un serveur qui n'a rien demandé, Options avancées ›
Utiliser un jeton d'accès fixe fait apparaître le champ.
Un jeton collé par erreur dans Certificat d'autorité (PEM) est reconnu et déplacé dans Jeton d'accès, avec un avis ; un certificat collé dans le champ du jeton va, lui, dans le champ du certificat.
4.3 Serveur à certificat auto-signé
Si le certificat du serveur n'est pas reconnu par le système (serveur personnel, réseau local), la
fiche affiche la section Certificat non reconnu, avec Émis pour et l'Empreinte SHA-256
présentée. Comparez-la avec celle que l'administrateur du serveur vous a communiquée (sur le
serveur : openssl x509 -in cert.pem -noout -fingerprint -sha256) ; si elles sont identiques, touchez
Faire confiance à ce certificat. La section devient Certificat : Tohru n'acceptera ensuite
que ce certificat pour ce serveur, y compris après l'enregistrement et au redémarrage. S'il change,
la connexion est refusée (« le certificat de … ne correspond pas à l'empreinte attendue ») et la fiche
montre l'Empreinte attendue à côté de la nouvelle. Oublier ce certificat retire cette confiance.
Le certificat se règle pour l'adresse (hôte et port), pas pour le chemin : une connexion sécurisée ne connaît que l'hôte et le port. Les serveurs d'une même adresse partagent donc le même réglage. Un nouveau serveur ajouté à une adresse déjà utilisée en reprend le réglage, et un certificat différent y est refusé (« le serveur enregistré « … » utilise déjà … avec un autre réglage de certificat »), même par un lien d'ajout. Si le certificat a réellement changé, modifiez d'abord le serveur enregistré : la confiance accordée dans sa fiche vaut alors pour toute l'adresse.
Une connexion coupée en cours de route (serveur qui redémarre, réseau interrompu) n'est pas présentée comme un problème de certificat : la liste indique « connexion sécurisée impossible avec … ».
Pour un serveur signé par une autorité privée, collez plutôt le certificat de l'autorité dans Options avancées › Certificat d'autorité (PEM).
4.4 Lien d'ajout
Un fournisseur peut publier un lien qui ouvre directement dans Tohru la fiche pré-remplie du serveur,
qui s'essaie aussitôt. Si le lien porte auth=bearer (le serveur attend un jeton), collez le jeton dans
Jeton d'accès (Coller connecte aussitôt, § 4.2) ; puis touchez Enregistrer.
https://r0o.wtf/tohru/add?url=https%3A%2F%2Fmcp.example.com%2Fmcp&name=example
tohru://add?url=https%3A%2F%2Fmcp.example.com%2Fmcp&name=example&sha256=6B:C1:80:…:68:BB&auth=bearer
| Paramètre | Rôle |
|---|---|
url |
Obligatoire : adresse du serveur (https:// ajouté s'il manque). |
name |
Facultatif : nom proposé. |
sha256 |
Facultatif : empreinte SHA-256 du certificat du serveur (64 chiffres hexadécimaux, avec ou sans « : » entre les paires, majuscules ou minuscules). Tohru l'affiche dans la section Certificat et l'épingle : la connexion n'aboutit que si le serveur présente ce certificat, sinon elle est refusée avec un message clair. Une empreinte invalide est ignorée, avec un avis. Un lien ne change jamais d'office le certificat accepté pour une adresse (hôte et port) déjà enregistrée : une autre empreinte y est montrée, jamais appliquée (ci-dessous et § 4.3). |
auth=bearer |
Facultatif : le serveur attend un jeton fixe ; la fiche s'ouvre avec la section Jeton d'accès au premier plan. |
Encodez chaque valeur (encodeURIComponent). Le jeton ne figure jamais dans un lien : un paramètre
qui en porterait un (token, access_token…) est ignoré, et la fiche le signale ; un jeton ou un mot de passe
glissé dans l'adresse elle-même (…/mcp?token=…, https://utilisateur:jeton@…) en est retiré, avec un avis. Le jeton se colle
dans la fiche (Presse-papiers universel entre le Mac et l'iPhone ou l'iPad). Le lien https:// s'ouvre
dans Tohru quand l'application est installée, et sinon affiche une page qui y mène ; il transmet à
l'application toute sa requête. Les liens existants (url seul, url et name) restent valables.
Serveur déjà enregistré. Si le lien désigne un serveur que vous avez déjà (même adresse et même chemin),
Tohru rouvre sa fiche au lieu d'en créer une seconde : collez-y le nouveau jeton si l'on vous en a remis un,
puis touchez Enregistrer ; rien ne change avant. Si l'empreinte du lien diffère de celle acceptée pour cette
adresse, la fiche montre les deux (section Empreinte du lien d'ajout) et garde l'empreinte enregistrée : le
certificat accepté ne change que si vous faites confiance à celui que le serveur présente (Faire confiance à ce
certificat), puis touchez Enregistrer. Un lien vers un autre chemin de la même adresse ajoute un second
serveur, dont le nom proposé est rendu unique (docs2…).
4.5 Régler les outils d'un serveur
Après Se connecter, la fiche liste les outils du serveur. Chacun se règle : Proposé (le modèle peut l'appeler), Avec confirmation (une carte vous demande votre accord à chaque appel) ou Masqué (jamais proposé au modèle). Un outil qui écrit, envoie ou supprime demande déjà une confirmation (§ 5).
4.6 Ce que Tohru fait de vos serveurs
- À la connexion, il appelle
initializepuistools/listsur chaque serveur, en parallèle, avec 12 s de délai : un serveur éteint apparaît en orange sans gêner les autres. - Le champ
instructionsrenvoyé parinitializeest ajouté à la consigne système (3 000 caractères au plus par serveur) : c'est l'endroit des règles communes aux outils d'un serveur. Le mode d'emploi d'un outil appartient à sa description. - Avec au moins un outil, la consigne rappelle au modèle d'employer les outils de recherche documentaire des serveurs MCP plutôt que la recherche sur le Web quand la question porte sur des documents ou une collection nommée.
- Un appel d'outil dispose de 420 s. Un outil en échec (certificat, jeton refusé, délai dépassé, serveur injoignable) renvoie son erreur au modèle et l'avis « L'outil « … » a échoué : … » s'affiche au-dessus de la réponse. Un serveur indisponible à la connexion est signalé une fois par conversation.
- Avec Apple Intelligence et des outils MCP actifs, une indication discrète (accueil, panneau d'état, réglages des serveurs) rappelle qu'un modèle à URL suit mieux les consignes des serveurs et appelle leurs outils plus sûrement.
- Avec Apple Intelligence, le résultat d'un outil est plafonné à 12 000 caractères (contexte de 32 768 jetons) ; un outil dont le schéma d'entrée ne se traduit pas pour Apple Intelligence est signalé dans le panneau d'état et réservé au modèle à URL.
- La liste des serveurs est enregistrée sur l'appareil, sans aucun secret : jetons, clés et autorisations sont dans le trousseau.
4.7 Pour les fournisseurs de serveurs MCP
Pour que vos utilisateurs n'aient qu'une adresse à coller :
- Transport :
streamable-httpsurhttps://(certificat d'une autorité publique, Let's Encrypt par exemple : aucune manipulation de certificat côté utilisateur). - Nom : renseignez
serverInfo.title(ouname) dans la réponse àinitialize, ouresource_namedans les métadonnées de ressource protégée ; Tohru en tire le nom proposé. Mettez les règles communes dansinstructionset le mode d'emploi de chaque outil dans sa description ; annotez les outils (readOnlyHint,destructiveHint). - Authentification : suivez la spécification d'autorisation MCP (révision 2025-11-25) :
- réponse
401avecWWW-Authenticate: Bearer resource_metadata="…", scope="…"; - métadonnées de ressource protégée (RFC 9728) à
/.well-known/oauth-protected-resource; - serveur d'autorisation publiant ses métadonnées (RFC 8414 ou OpenID Connect), PKCE
S256annoncé danscode_challenge_methods_supported, paramètreresource(RFC 8707) accepté ; - inscription du client par document de métadonnées (
client_id_metadata_document_supported) — l'identifiant de Tohru esthttps://r0o.wtf/tohru/oauth/client.json, son adresse de retourhttps://r0o.wtf/tohru/oauth/callback, client public (token_endpoint_auth_method: none) — ou, à défaut, par inscription dynamique (RFC 7591,registration_endpoint) ; - si la page de connexion envoie une politique
Content-Security-Policyavecform-action, elle doit autoriser l'origine de l'adresse de retour (https://r0o.wtf) : sinon le navigateur bloque le retour vers l'application après l'envoi du formulaire ; - jeton de rafraîchissement (
refresh_token) recommandé : Tohru renouvelle seul l'accès. - Une simple clé d'API en
Authorization: Bearerreste possible (§ 4.2). - Publiez un lien d'ajout (§ 4.4) sur votre page d'assistance. Certificat auto-signé : mettez-y son
empreinte (
sha256), l'utilisateur n'aura aucune question de confiance ; clé d'API : ajoutezauth=beareret répondez « 401 » sans métadonnées OAuth, la fiche demandera le jeton. Jamais de jeton dans le lien.
5. Confirmation des actions
Un outil qui agit (écrit, envoie, supprime, commande…) n'est jamais exécuté sans votre accord : une carte s'affiche sous la réponse avec l'outil et tous ses arguments ; seul Autoriser fait partir l'appel. Refuser, ne pas répondre en 5 minutes ou arrêter la réponse (Stop, ⌘.) vaut refus, et les autres actions de la même réponse sont alors écartées.
Tohru reconnaît un outil qui agit par ses annotations MCP (readOnlyHint, destructiveHint), sinon
par le verbe de tête de son nom (send_…, delete_…, create_…, ajouter_……). Le réglage de chaque
outil dans la fiche du serveur (§ 4.5) corrige ce classement.
6. Pièces jointes, dictée, voix
- Bouton + ou glisser-déposer : images, PDF, documents Word. Le PDF est lu sur l'appareil (reconnaissance de caractères pour les pages numérisées).
- Micro : dictée transcrite sur l'appareil, dans la langue de l'appareil ; la réponse à une question dictée est lue à voix haute (Réglages › Général : « Lire chaque réponse à voix haute »).
7. Dépannage
| Symptôme | Cause et remède |
|---|---|
| « Apple Intelligence n'est pas disponible » | Activez-la (Réglages › Apple Intelligence et Siri) sur un appareil compatible, ou choisissez un modèle à URL. |
| « Quota d'Apple Intelligence atteint » | Le quota du compte iCloud est épuisé pour le moment : attendez la remise à zéro ou basculez sur un modèle à URL. |
| « Les garde-fous d'Apple Intelligence ont refusé cette demande » | Reformulez, ou utilisez un modèle à URL. |
| Serveur en orange « connexion requise » | Le serveur demande de vous identifier : ouvrez sa fiche, S'identifier auprès du serveur… (§ 4.2). |
| Serveur en orange « jeton refusé (HTTP 401) » | Clé d'API absente ou refusée : corrigez Jeton d'accès dans la fiche du serveur (§ 4.2). |
| Serveur en orange « certificat non reconnu » | Certificat auto-signé : ouvrez sa fiche et vérifiez l'empreinte présentée avant de lui faire confiance (§ 4.3), ou collez le certificat de l'autorité. |
| Serveur en orange « … ne correspond pas à l'empreinte attendue » | Le serveur présente un autre certificat que celui accepté : ne faites confiance au nouveau que si son administrateur vous confirme le changement (§ 4.3). |
| Fiche : « le serveur enregistré « … » utilise déjà … avec un autre réglage de certificat » | Ce serveur a la même adresse (hôte et port) qu'un serveur enregistré dont le certificat accepté est différent : vérifiez l'adresse ; si le certificat a changé, modifiez d'abord le serveur enregistré (§ 4.3). |
| Serveur en orange « connexion sécurisée impossible avec … » | La connexion a été coupée pendant l'échange chiffré (serveur qui redémarre, réseau) : touchez Reconnecter les serveurs. Ce n'est pas un problème de certificat. |
| Réponse précédée de l'avis « La réponse du modèle s'est interrompue » ou « … elle est peut-être incomplète » | Le service du modèle s'est arrêté en cours de réponse : reposez la question. |
| Rien ne répond sur le réseau local | Autorisez « Réseau local » pour Tohru (Réglages › Confidentialité et sécurité › Réseau local). |
http:// refusé |
Le HTTP clair n'est permis que vers le réseau local : utilisez HTTPS pour un serveur sur Internet. |
8. Confidentialité
- Les conversations sont enregistrées sur l'appareil uniquement ; jetons, clés et autorisations OAuth dans le trousseau. La connexion à un serveur protégé se fait sur la page de son fournisseur : Tohru ne voit pas votre mot de passe.
- Avec Apple Intelligence, les requêtes sont traitées par Private Cloud Compute d'Apple ; avec un modèle à URL, elles vont au serveur que vous avez désigné ; les appels d'outils vont à vos serveurs MCP.
- Le développeur de Tohru ne reçoit aucune donnée : ni compte, ni statistique, ni publicité.
Tohru — User Guide
Tohru is a conversational assistant for Mac, iPhone, iPad, and iPhone Duo. It answers with Apple Intelligence (the Private Cloud Compute server model) right after installation, or with your own model specified by its URL, and it can use the tools of your MCP servers (Model Context Protocol).
- First Launch
- Choosing the Engine
- Using Your Own Model (Inference URL)
- Giving Tohru Tools: MCP Servers
- Confirming Actions
- Attachments, Dictation, Voice
- Troubleshooting
- Privacy
1. First Launch
Nothing to configure: just ask your question. Tohru uses Apple Intelligence (Private Cloud Compute).
Requirements: a device compatible with Apple Intelligence, Apple Intelligence turned on (Settings › Apple Intelligence & Siri), and an Internet connection. Requests count against the daily quota of your iCloud account; the quota status is shown in Settings › General and in the status panel (the status button at the bottom of the conversation list). The gear ⚙︎ next to it opens Settings; the magnifying glass at the top right of the list searches conversations; a swipe to the left deletes a conversation.
2. Choosing the Engine
Settings › General › Engine (Mac: Tohru menu › Settings…, ⌘, or the gear ⚙︎; iPhone and iPad: the gear ⚙︎ at the bottom of the conversation list). The menu at the bottom of the conversation list also lets you switch at any time.
| Engine | When to choose it |
|---|---|
| Apple Intelligence (Private Cloud Compute) | Default: no setup, 32,768-token context. |
| OpenAI-Compatible Model (URL) | Local model (Ollama, LM Studio…) or online service: large context, no Apple quota. |
Both engines share the conversations, the MCP tools, the System Prompt, and the Temperature (Settings › General). The default prompt follows the device language; “Restore Default Prompt” discards a custom prompt.
3. Using Your Own Model (Inference URL)
Settings › Model by URL:
| Field | Example | Purpose |
|---|---|---|
| URL | http://192.168.1.20:11434/v1 |
Address of the OpenAI-compatible API, usually ending in /v1. Tohru calls …/chat/completions and …/models. |
| Model | qwen3:8b |
Model name. The List button queries …/models and offers the server's models. |
| Display Name | Living room Ollama |
Optional. |
| Key | Optional: sent as Authorization: Bearer, stored in the keychain (synced through iCloud), never in a file. Not needed for Ollama or LM Studio. |
|
| Keychain Account | inference |
Name under which the key is stored. |
| Context | 32768 |
The model's advertised context window, in tokens. |
| Reasoning | Server Setting | Sent as reasoning_effort (none, low, medium, high) to reasoning models. |
Save and Use This Model saves it and selects it as the engine; Remove switches back to Apple Intelligence.
Common addresses:
| Server | URL |
|---|---|
| Ollama | http://<address>:11434/v1 (on the same Mac: http://localhost:11434/v1) |
| LM Studio | http://<address>:1234/v1 |
vLLM, llama.cpp (llama-server) |
http://<address>:8000/v1 (port depends on how you launch it) |
| Online service | the provider's “OpenAI-compatible” base URL, with its key |
Unencrypted HTTP is accepted only toward the local network (private addresses,
.local); a service on the Internet must use HTTPS. With Ollama, expose the server to the network (OLLAMA_HOST=0.0.0.0) and set its context window (OLLAMA_CONTEXT_LENGTH).
4. Giving Tohru Tools: MCP Servers
An MCP (Model Context Protocol) server gives Tohru tools: searching documentation, reading a folder, controlling a service… To add one, its address is all you need: Tohru discovers its tools on its own and, if the server is protected, opens its login page. There is no file to write.
Tohru reaches MCP servers over streamable HTTP (an address usually ending with /mcp). “stdio”
servers, launched from the command line, cannot be reached from an iPhone: their provider has to
expose them over HTTP (for example with mcp-proxy).
4.1 Adding a Server by Its Address
Settings › MCP Servers › Add a server (Mac: Tohru menu › Settings…, ⌘, or the gear ⚙︎; iPhone and iPad: the gear ⚙︎ at the bottom of the conversation list › MCP Servers).
- Paste into Server address the address the provider gave you (
https://is added if missing). - Tap Connect. Tohru queries the server and lists its tools; the Name is taken from the one the server announces, and you can change it. Depending on the server's answer, the sheet shows what is needed, and only that:
- a login page opens right away (server protected by OAuth, § 4.2);
- the Access token section comes to the front (API-key server, § 4.2);
- the Unrecognized certificate section shows the certificate's fingerprint (self-signed certificate, § 4.3).
- Tap Save.
For a first try, Add the DeepWiki example adds a public server, with no account, that answers questions about public GitHub repositories. Then ask: “Using DeepWiki, what is the modelcontextprotocol/swift-sdk repository for?”
The list shows each server with its status (number of tools, or an error in orange); selecting it reopens its sheet. Delete this server (at the bottom of the sheet; on iPhone and iPad, also by swiping in the list) removes it after confirmation.
4.2 Servers That Ask You to Sign In
For a protected server, Connect opens the provider's login page directly (account, password, two-factor authentication…), where Tohru introduces itself as Tohru AI. Once you allow access, you return to Tohru and the tools appear:
- Tohru never sees your password; it receives an access token limited to this server, kept in this device's keychain and renewed automatically (each device signs in once);
- Sign in to the server… reopens the page if you closed it; Sign out of this server erases the authorization.
This sign-in follows the MCP authorization standard (OAuth 2.1 with PKCE). If the provider gave you a client ID, enter it under Advanced options › OAuth client ID; otherwise Tohru identifies itself.
Some servers issue an API key (static token) instead and answer “401” without publishing OAuth metadata. After Connect, the sheet then shows the Access token section at the front, with the message “This server requires an access token: paste it into the “Access token” field, then “Connect”.”:
- tap Paste in the Access token section: Tohru connects right away (a token typed in, or pasted into the field with ⌘V, needs Connect); on iPhone and iPad, a token copied on the Mac arrives through Universal Clipboard;
- tap Save.
The token is sent as Authorization: Bearer and kept in the keychain; it never appears in a file,
a link or a QR code. A rejected token shows “Token rejected by the server (HTTP 401).” Stop sending a
token removes it. For a server that did not ask for one, Advanced options › Use a static access
token shows the field.
A token pasted by mistake into CA certificate (PEM) is recognized and moved to Access token, with a notice; a certificate pasted into the token field goes to the certificate field.
4.3 Servers with a Self-Signed Certificate
If the system does not recognize the server's certificate (personal server, local network), the
sheet shows the Unrecognized certificate section, with Issued to and the SHA-256 fingerprint
presented. Compare it with the one the server's administrator gave you (on the server: openssl x509
-in cert.pem -noout -fingerprint -sha256); if they match, tap Trust this certificate. The section
becomes Certificate: Tohru will then accept this certificate and no other for this server,
including after saving and after a restart. If it changes, the connection is refused (“the certificate
of … does not match the expected fingerprint”) and the sheet shows the Expected fingerprint next to
the new one. Forget this certificate removes this trust.
The certificate is set for the address (host and port), not for the path: a secure connection only knows the host and the port. Servers at the same address therefore share the same setting. A new server added at an address already in use takes over its setting, and a different certificate is refused there (“the saved server “…” already uses … with a different certificate setting”), even through an add link. If the certificate really changed, edit the saved server first: the trust granted in its sheet then applies to the whole address.
A connection cut off midway (server restarting, network interrupted) is not reported as a certificate problem: the list says “secure connection to … failed”.
For a server signed by a private authority, paste the authority's certificate into Advanced options › CA certificate (PEM) instead.
4.4 Add Links
A provider can publish a link that opens the server's prefilled sheet directly in Tohru, which tries the
connection right away. If the link carries auth=bearer (the server expects a token), paste the token
into Access token (Paste connects right away, § 4.2); then tap Save.
https://r0o.wtf/tohru/add?url=https%3A%2F%2Fmcp.example.com%2Fmcp&name=example
tohru://add?url=https%3A%2F%2Fmcp.example.com%2Fmcp&name=example&sha256=6B:C1:80:…:68:BB&auth=bearer
| Parameter | Role |
|---|---|
url |
Required: the server address (https:// added if missing). |
name |
Optional: suggested name. |
sha256 |
Optional: SHA-256 fingerprint of the server's certificate (64 hexadecimal digits, with or without “:” between pairs, upper or lower case). Tohru shows it in the Certificate section and pins it: the connection only succeeds if the server presents this certificate; otherwise it is refused with a clear message. An invalid fingerprint is ignored, with a notice. A link never changes on its own the certificate accepted for an address (host and port) that is already saved: a different fingerprint is shown there, never applied (below and § 4.3). |
auth=bearer |
Optional: the server expects a static token; the sheet opens with the Access token section at the front. |
Encode every value (encodeURIComponent). The token is never part of a link: a parameter that would
carry one (token, access_token…) is ignored, and the sheet says so; a token or password slipped into
the address itself (…/mcp?token=…, https://user:token@…) is removed from it, with a notice. The token is pasted into the
sheet (Universal Clipboard between the Mac and the iPhone or iPad). The https:// link opens in Tohru
when the app is installed, and otherwise shows a page that leads to it; it passes its whole query to
the app. Existing links (url alone, url and name) remain valid.
Server already saved. If the link points to a server you already have (same address and same path),
Tohru reopens its sheet instead of adding a second one: paste the new token there if you were given one,
then tap Save; nothing changes before that. If the link's fingerprint differs from the one accepted for that
address, the sheet shows both (Add link fingerprint section) and keeps the saved fingerprint: the accepted
certificate only changes if you trust the one the server actually presents (Trust this certificate), then
tap Save. A link to another path at the same address adds a second server, with a unique suggested name
(docs2…).
4.5 Setting a Server's Tools
After Connect, the sheet lists the server's tools. Each one can be set to Offered (the model may call it), With confirmation (a card asks for your approval at every call) or Hidden (never offered to the model). A tool that writes, sends or deletes already asks for confirmation (§ 5).
4.6 What Tohru Does with Your Servers
- On connecting, it calls
initializethentools/liston each server, in parallel, with a 12 s timeout: a server that is down appears in orange without affecting the others. - The
instructionsfield returned byinitializeis added to the system prompt (up to 3,000 characters per server): this is where rules shared by a server's tools belong. How to use a tool belongs in its description. - With at least one tool, the prompt reminds the model to use the MCP servers' document search tools rather than a web search when the question is about documents or a named collection.
- A tool call has 420 s. A failing tool (certificate, rejected token, timeout, unreachable server) returns its error to the model and the notice “The tool “…” failed: …” appears above the reply. A server unavailable at connection time is reported once per conversation.
- With Apple Intelligence and active MCP tools, a discreet hint (welcome screen, status panel, server settings) recalls that a model by URL follows the servers' instructions and calls their tools more reliably.
- With Apple Intelligence, a tool's result is capped at 12,000 characters (32,768-token context); a tool whose input schema cannot be translated for Apple Intelligence is flagged in the status panel and reserved for the model by URL.
- The server list is stored on the device without any secrets: tokens, keys and authorizations are in the keychain.
4.7 For MCP Server Providers
So that your users only have an address to paste:
- Transport:
streamable-httpoverhttps://(a certificate from a public authority, such as Let's Encrypt: no certificate handling for the user). - Name: fill in
serverInfo.title(orname) in theinitializeresponse, orresource_namein the protected resource metadata; Tohru derives the suggested name from it. Put shared rules ininstructionsand each tool's usage in its description; annotate tools (readOnlyHint,destructiveHint). - Authentication: follow the MCP authorization specification (revision 2025-11-25):
- a
401response withWWW-Authenticate: Bearer resource_metadata="…", scope="…"; - protected resource metadata (RFC 9728) at
/.well-known/oauth-protected-resource; - an authorization server publishing its metadata (RFC 8414 or OpenID Connect), with PKCE
S256listed incode_challenge_methods_supportedand theresourceparameter (RFC 8707) accepted; - client registration through a metadata document (
client_id_metadata_document_supported) — Tohru's client ID ishttps://r0o.wtf/tohru/oauth/client.json, its redirect URIhttps://r0o.wtf/tohru/oauth/callback, public client (token_endpoint_auth_method: none) — or, failing that, dynamic registration (RFC 7591,registration_endpoint); - if the login page sends a
Content-Security-Policywithform-action, it must allow the redirect URI's origin (https://r0o.wtf): otherwise the browser blocks the return to the app after the form is submitted; - a refresh token (
refresh_token) is recommended: Tohru renews access on its own. - A plain API key sent as
Authorization: Bearerremains possible (§ 4.2). - Publish an add link (§ 4.4) on your support page. Self-signed certificate: include its fingerprint
(
sha256), and the user gets no trust question; API key: addauth=bearerand answer “401” without OAuth metadata, and the sheet asks for the token. Never put a token in the link.
5. Confirming Actions
A tool that acts (writes, sends, deletes, issues commands…) is never run without your consent: a card appears below the reply showing the tool and all of its arguments; only Allow sends the call. Declining, not answering within 5 minutes, or stopping the reply (Stop, ⌘.) counts as a refusal, and the other actions in the same reply are then discarded.
Tohru recognizes a tool that acts by its MCP annotations (readOnlyHint, destructiveHint), or otherwise
by the leading verb of its name (send_…, delete_…, create_…, ajouter_……). Each tool's setting
in the server's sheet (§ 4.5) overrides this classification.
6. Attachments, Dictation, Voice
- + button or drag and drop: images, PDFs, Word documents. PDFs are read on the device (with text recognition for scanned pages).
- Microphone: dictation transcribed on the device, in the device language; the reply to a dictated question is read aloud (Settings › General: “Read Every Response Aloud”).
7. Troubleshooting
| Symptom | Cause and fix |
|---|---|
| “Apple Intelligence is not available” | Turn it on (Settings › Apple Intelligence & Siri) on a compatible device, or choose a model by URL. |
| “Apple Intelligence quota reached” | The iCloud account's quota is used up for now: wait for it to reset or switch to a model by URL. |
| “Apple Intelligence’s guardrails declined this request” | Rephrase, or use a model by URL. |
| Server in orange, “sign-in required” | The server asks you to sign in: open its sheet, Sign in to the server… (§ 4.2). |
| Server in orange, “token rejected (HTTP 401)” | API key missing or rejected: correct Access token in the server's sheet (§ 4.2). |
| Server in orange, “unrecognized certificate” | Self-signed certificate: open its sheet and check the fingerprint shown before trusting it (§ 4.3), or paste the authority's certificate. |
| Server in orange, “… does not match the expected fingerprint” | The server presents a different certificate from the one accepted: only trust the new one if its administrator confirms the change (§ 4.3). |
| Sheet: “the saved server “…” already uses … with a different certificate setting” | This server has the same address (host and port) as a saved server whose accepted certificate is different: check the address; if the certificate changed, edit the saved server first (§ 4.3). |
| Server in orange, “secure connection to … failed” | The connection was cut during the encrypted exchange (server restarting, network): tap Reconnect Servers. It is not a certificate problem. |
| Reply preceded by the notice “The model’s reply was interrupted” or “… the reply may be incomplete” | The model's service stopped mid-reply: ask the question again. |
| Nothing responds on the local network | Allow “Local Network” for Tohru (Settings › Privacy & Security › Local Network). |
http:// rejected |
Plain HTTP is allowed only toward the local network: use HTTPS for a server on the Internet. |
8. Privacy
- Conversations are stored on the device only; tokens, keys and OAuth authorizations in the keychain. Signing in to a protected server happens on its provider's page: Tohru does not see your password.
- With Apple Intelligence, requests are processed by Apple's Private Cloud Compute; with a model by URL, they go to the server you specified; tool calls go to your MCP servers.
- The developer of Tohru receives no data: no account, no analytics, no advertising.