Djelia MCP Server
OfficialClick on "Install 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 ServerTranslate '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).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full burden. It discloses the return shape (list of {'code','name'}) and provides exact codes and names, which is concrete behavioral information. It omits error handling and auth, but that is acceptable for a simple read-only listing.
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 short sentences: first states the purpose plainly, second provides return format and examples. No wasted words; fully front-loaded.
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 zero-parameter tool with an output schema, the description fully covers the purpose and return shape. Nothing is missing for an agent to call it correctly; the examples make the output concrete.
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?
The tool has zero parameters, so baseline is 4. The description adds no parameter info because none is needed; the schema already shows no properties.
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?
Description uses specific verb 'List' and resource 'languages supported by Djelia translation', distinguishing it from siblings (translate, transcribe, text-to-speech) as a discovery tool. The purpose is unambiguous.
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?
Clear context: use this to see which language codes/names are available for translation. It does not explicitly state alternatives or when-not-to-use, but sibling tools are obviously different, so usage intent is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
text_to_speechA
Synthesize Bambara speech from text with desired voice description.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The text to convert to speech. | |
| format | No | Output audio format. Default mp3. | mp3 |
| description | Yes | Voice style/characteristics (e.g. "calm male voice, slow pace"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only restates the core action without detailing output format, side effects, authentication needs, rate limits, or any constraints. The schema provides the `format` parameter, but the description does not explain what the tool returns or how it behaves.
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?
The description is a single, front-loaded sentence that immediately conveys the tool's purpose and key inputs. No wasted words.
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?
Given the simplicity of the tool and the well-documented schema, the description is adequate but not complete. It does not mention the return value (e.g., audio data) or any caveats, and the absence of an output schema means more responsibility falls on the description to explain behavior.
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?
Schema description coverage is 100%, so the baseline is 3. The description adds little beyond naming `text` and `description`; it does not clarify the `format` parameter or provide any additional meaning beyond the existing schema descriptions.
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 uses a specific verb ('Synthesize') and resource ('Bambara speech'), and clarifies the two main inputs (`text` and `description`). This clearly distinguishes it from sibling tools like `translate`, `transcribe`, and `list_supported_languages`.
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?
The description implies the tool is for converting text to Bambara speech, but it does not explicitly state when to use it over alternatives or mention any exclusions. There is no guidance on when not to use it or when a sibling tool would be more appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transcribeB
Transcribe Bambara speech to text using Djelia V2.
| Name | Required | Description | Default |
|---|---|---|---|
| audio_base64 | Yes | Audio file bytes encoded as base64. Supported: common formats (mp3, wav, m4a, ...). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only mentions the model name and task, without detailing output format, supported audio formats beyond what the schema implies, or any limitations. This is minimal behavioral context.
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?
The description is a single, concise sentence that front-loads the action and subject. It contains no filler, every word earns its place.
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?
With no annotations and no output schema, the description is expected to provide more context about return values, error conditions, or behavioral expectations. It offers none, leaving significant gaps for an agent trying to invoke the tool correctly.
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?
The input schema provides a complete description of the single parameter (audio_base64) with format details, achieving 100% schema coverage. The tool description adds no additional parameter-specific meaning, so the baseline score of 3 applies.
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 uses the specific verb 'transcribe' and clearly identifies the resource ('Bambara speech') and the model ('Djelia V2'), distinguishing it from sibling tools like translate and text_to_speech.
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?
The description implies the tool is for transcribing Bambara audio, giving clear context, but it does not explicitly state when to use it versus alternatives or mention any exclusions. Sibling tools are provided, but the description itself lacks direct guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
translateA
Translate text from source to target language.
Use list_supported_languages to get valid codes. Returns {"text": ""}.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| source | Yes | ||
| target | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the return format as a JSON object with the translated text, which is useful behavioral context. There are no annotations, but it does not cover error behavior, restrictions, or whether source and target must differ, leaving some gaps.
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?
The description is concise, consisting of two sentences. It fronts the main action and includes only essential additional guidance about language codes and return format, with no fluff.
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 simple translation tool with three parameters and no annotations, the description covers the core purpose, parameter roles, and return structure. It does not discuss edge cases like invalid codes or source-target equality, but the pointer to list_supported_languages helps mitigate the need for more detail.
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?
The description explains the role of each parameter (text, source, target) in context, but schema description coverage is 0%. It does not explain the meanings of the enum values (e.g., bam_Latn), relying on a pointer to list_supported_languages, which partially compensates for the lack of schema descriptions.
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 clearly states the action ('Translate') and operands (text, source, target language). It distinguishes itself from sibling tools such as transcribe and text_to_speech by specifying the exact task of language translation.
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?
The description gives clear context for when to use the tool (translation) and explicitly directs users to list_supported_languages for valid codes, establishing a prerequisite. However, it does not mention when to avoid this tool or explicitly compare with alternatives like transcribe.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
4 tool updates
v0.1.0- First observed
list_supported_languages - First observed
text_to_speech - First observed
transcribe - First observed
translate
TDQS
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
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
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.3MIT
- FlicenseNot gradedqualityBmaintenanceAn 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.-
- AlicenseAqualityAmaintenanceMCP server for audio transcription using local faster-whisper or OpenAI Whisper API, enabling multilingual transcription with optional GPT post-processing.3MIT
- AlicenseNot gradedqualityDmaintenanceA lightweight MCP server empowering LLM clients with Indic language processing: translation, transliteration, language identification, and chat with Sarvam AI models.MIT
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/djelia-org/djelia-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server