Djelia MCP Server
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Djelia MCP Server Translate 'How are you?' to Bambara"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
šļø Djelia MCP Server
An MCP server for Djelia ā bring Bambara transcription, translation, and text-to-speech to any LLM.
Built with FastMCP v3 Ā· Python 3.11+ Ā· uv-managed
⨠Overview
Djelia is a linguistic-AI platform focused on African languages ā currently Bambara (bam_Latn), with translation bridging to French (fra_Latn) and English (eng_Latn).
This server wraps the Djelia REST API behind the Model Context Protocol, so any MCP-compatible client (Claude Desktop, Cursor, Cline, your own agent) can call Djelia's models as native tools ā no SDK glue, no HTTP plumbing in your prompt.
What you get
# | Tool | Direction | V1 / V2 | Returns |
1 |
| ā | ā | JSON list |
2 |
| text ā text | v1 | translated text |
3 |
| audio ā text | v2 | text + segment timing |
4 |
| text ā audio | v2 | audio content block |
Design note: V2 APIs are exposed for transcription and TTS because they supersede V1 (richer voices via
description, format control). True/streamendpoints are omitted ā MCP is request/response, so we aggregate the stream inside the tool. Add raw streaming tools only if a use case needs them.
Related MCP server: sarvam-tools
šļø Architecture
flowchart LR
subgraph Client["MCP Client"]
LLM["LLM / Agent<br/>(Claude, Cursor, ā¦)"]
end
subgraph Server["djelia-mcp-server (this repo)"]
MCP["FastMCP Server<br/><i>4 tools, stdio Ā· sse Ā· http</i>"]
HANDLERS["Tool Handlers<br/>translate Ā· transcribe Ā· tts"]
HTTP["httpx.AsyncClient<br/><i>x-api-key header</i>"]
MCP --> HANDLERS --> HTTP
end
subgraph Djelia["Djelia Cloud API"]
T1["/v1/translate"]
T2["/v2/transcribe"]
T3["/v2/tts"]
end
LLM -- "MCP JSON-RPC" --> MCP
HTTP -- "HTTPS" --> T1
HTTP -- "HTTPS" --> T2
HTTP -- "HTTPS" --> T3Key design choices
One shared HTTP client ā
x-api-keyheader injected once per request; key read fromDJELIA_API_KEYenv var.base64 for audio input ā MCP payloads are JSON; audio bytes travel as base64 so it works across any client. A magic-byte sniffer (
_guess_ext) recovers the right file extension for the multipart upload.Audio output as a content block ā FastMCP's
Audiohelper returns a proper MCP audio block (clients receive it base64-encoded).
š§ How each tool works
1 Ā· list_supported_languages
Returns the language codes you'll pass to translate.
sequenceDiagram
participant C as Client
participant S as MCP Server
participant D as Djelia API
C->>S: list_supported_languages()
S->>D: GET /api/v1/models/translate/supported-languages
D-->>S: [{code, name}, ...]
S-->>C: structured list2 Ā· translate
sequenceDiagram
participant C as Client
participant S as MCP Server
participant D as Djelia API
C->>S: translate(source, target, text)
S->>D: POST /api/v1/models/translate (JSON)
D-->>S: { "text": "<translated>" }
S-->>C: structured dictParameters
Name | Type | Values |
| enum |
|
| enum |
|
| string | the text to translate |
3 Ā· transcribe (Bambara audio ā text)
The tool decodes base64 ā sniffs the format ā uploads as multipart to the V2 transcription endpoint.
sequenceDiagram
participant C as Client
participant S as MCP Server
participant D as Djelia API
C->>S: transcribe(audio_base64)
S->>S: base64decode + guess_ext (mp3/wav/m4a/ogg)
S->>D: POST /api/v2/models/transcribe (multipart)
alt single text response
D-->>S: { "text": "..." }
else segmented response
D-->>S: [{ text, start, end }, ...]
end
S-->>C: ToolResult (structured + text)4 Ā· text_to_speech (text ā Bambara audio)
sequenceDiagram
participant C as Client
participant S as MCP Server
participant D as Djelia API
C->>S: text_to_speech(text, description, format)
S->>D: POST /api/v2/models/tts (JSON)
D-->>S: binary audio bytes
S-->>C: Audio content block (base64)Parameters
Name | Type | Values |
| string | text to synthesize |
| string | voice style, e.g. |
| enum |
|
š Quickstart
1 Ā· Prerequisites
uv installed
A Djelia API key ā get one at https://console.djelia.cloud
2 Ā· Install dependencies
git clone <your-repo-url> djelia-mcp-server
cd djelia-mcp-server
uv sync3 Ā· Set your API key
cp .env.example .env
# edit .env:
# DJELIA_API_KEY=your_key_hereThe server reads DJELIA_API_KEY from the environment. It fails fast with a clear message if the key is missing.
š Transports
FastMCP supports three transports. Pick the one your client expects.
flowchart TB
subgraph "Transport decision"
STDIO["stdio<br/><b>default</b><br/>Claude Desktop, CLI agents"]
SSE["sse<br/><b>legacy</b><br/>older MCP clients"]
HTTP["http / streamable-http<br/><b>recommended for network</b>"]
end
STDIO -. "stdin/stdout" .-> Srv["FastMCP Server"]
SSE -. "HTTP + EventSource<br/>GET /sse/" .-> Srv
HTTP -. "HTTP POST<br/>POST /mcp/" .-> SrvMode | Command | Endpoint |
stdio (default) |
| ā |
sse (legacy) |
|
|
http |
|
|
streamable-http |
|
|
Override host/port with --host / -p. See all options: uv run fastmcp run --help.
Direct Python (without the fastmcp CLI)
Transport is read from DJELIA_TRANSPORT (stdio | sse | http):
DJELIA_TRANSPORT=sse DJELIA_HOST=127.0.0.1 DJELIA_PORT=8000 uv run python server.pyš¤ Client configuration
Claude Desktop / Cursor (stdio)
Drop this into your MCP client config:
{
"mcpServers": {
"djelia": {
"command": "uv",
"args": [
"run",
"--directory",
"/absolute/path/to/djelia-mcp-server",
"fastmcp",
"run",
"server.py"
],
"env": {
"DJELIA_API_KEY": "your_api_key"
}
}
}
}Remote / networked client (SSE or HTTP)
Run the server with -t sse or -t http, then point your client at the endpoint (e.g. http://your-host:8000/mcp/).
šļø Project layout
djelia-mcp-server/
āāā server.py # all 4 tools + httpx client + transport switch
āāā pyproject.toml # uv project (fastmcp + httpx)
āāā .env.example # DJELIA_API_KEY template
āāā .gitignore
āāā README.mdOne file of code ā by design. Tools are co-located because they share one client and one concern (calling Djelia).
š§Ŗ Verifying it works
Smoke-test that all tools register and the server boots on every transport:
# list registered tools
uv run python -c "import asyncio, server; \
[print(' -', t.name) for t in asyncio.run(server.mcp.list_tools())]"
# boot a transport
uv run fastmcp run server.py -t sse -p 8000You should see 4 tools listed, and the FastMCP banner with transport 'sse' followed by Uvicorn running.
š References
Djelia API docs ā https://djelia.cloud/redoc
Djelia console (get an API key) ā https://console.djelia.cloud
FastMCP ā https://gofastmcp.com
Model Context Protocol ā https://modelcontextprotocol.io
š License
MIT
Available Tools
4 toolslist_supported_languagesA
List languages supported by Djelia translation.
Returns a list of {"code": str, "name": str}. Codes: bam_Latn (Bambara), fra_Latn (French), eng_Latn (English).
Inputs: no named parameters. Returns: result
text_to_speechA
Synthesize Bambara speech from text with desired voice description.
Inputs: text (required), description (required), format.
transcribeB
Transcribe Bambara speech to text using Djelia V2.
Inputs: audio_base64 (required).
translateA
Translate text from source to target language.
Use list_supported_languages to get valid codes. Returns {"text": ""}.
Inputs: text (required), source (required), target (required). Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelogā¦
TDQS
Scored across 4 tools
Each tool targets a distinct operation: listing languages, translating text, transcribing speech, and synthesizing speech. There is no overlap or ambiguity between them.
Tool names mix verb-led formats like 'list_supported_languages' and 'translate' with the noun phrase 'text_to_speech'. The pattern is not fully consistent but remains readable and predictable.
Four tools is a well-scoped size for a language services server, covering translation, transcription, TTS, and language discovery without bloat or thinness.
The tool surface covers the core language lifecycle: discover languages, translate, transcribe, and synthesize. Minor gaps exist (e.g., no explicit voice listing or language detection), but they are not obvious dead ends for the stated purpose.
Maintenance
Related MCP Connectors
Bambara AI over MCP: text-to-speech, transcription and translation (Bamanankan + more).
MCP server for AI dialogue using various LLM models via AceDataCloud
MCP server for Speech-to-Text
MCP server for RiverScript, an AI transcription platform - fetches transcripts shared via a link.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP server for offline speech-to-text and speaker diarization, enabling AI agents to transcribe audio locally without cloud APIs.68 PyPI3MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server providing tools for speech-to-text, translation, language detection, question answering, and text-to-speech using Sarvam AI models, enabling multilingual voice agents.-
- AlicenseAqualityBmaintenanceMCP server for audio transcription using local faster-whisper or OpenAI Whisper API, enabling multilingual transcription with optional GPT post-processing.3117 PyPIMIT
- AlicenseNot gradedqualityDmaintenanceA lightweight MCP server empowering LLM clients with Indic language processing: translation, transliteration, language identification, and chat with Sarvam AI models.MIT