MCP Server for OpenMetadata
by yangkyeongmo
# mcp-server-openmetadata
A Model Context Protocol (MCP) server implementation for OpenMetadata, enabling seamless integration with MCP clients. This project provides a standardized way to interact with OpenMetadata through the Model Context Protocol.
<a href="https://glama.ai/mcp/servers/lvgl5cmxa6">
<img width="380" height="200" src="https://glama.ai/mcp/servers/lvgl5cmxa6/badge" alt="Server for OpenMetadata MCP server" />
</a>
## About
This project implements a [Model Context Protocol](https://modelcontextprotocol.io/introduction) server that wraps OpenMetadata's REST API, allowing MCP clients to interact with OpenMetadata in a standardized way.
## Feature Implementation Status
| Feature | API Path | Status |
|---------|----------|--------|
| **Data Assets** | | |
| List Databases | `/api/v1/databases` | ❌ |
| Get Database | `/api/v1/databases/{id}` | ❌ |
| Get Database by Name | `/api/v1/databases/name/{fqn}` | ❌ |
| Export Database | `/api/v1/databases/name/{name}/export` | ❌ |
| Import Database | `/api/v1/databases/name/{name}/import` | ❌ |
| List Tables | `/api/v1/tables` | ✅ |
| Get Table | `/api/v1/tables/{id}` | ✅ |
| Get Table by Name | `/api/v1/tables/name/{fqn}` | ✅ |
| Create Table | `/api/v1/tables` | ✅ |
| Update Table | `/api/v1/tables/{id}` | ✅ |
| Delete Table | `/api/v1/tables/{id}` | ✅ |
| Export Table | `/api/v1/tables/name/{name}/export` | ❌ |
| Import Table | `/api/v1/tables/name/{name}/import` | ❌ |
| List Metrics | `/api/v1/metrics` | ❌ |
| Get Metric | `/api/v1/metrics/{id}` | ❌ |
| List Dashboards | `/api/v1/dashboards` | ❌ |
| Get Dashboard | `/api/v1/dashboards/{id}` | ❌ |
| Get Dashboard by Name | `/api/v1/dashboards/name/{fqn}` | ❌ |
| List Reports | `/api/v1/reports` | ❌ |
| Get Report | `/api/v1/reports/{id}` | ❌ |
| List Pipelines | `/api/v1/pipelines` | ❌ |
| Get Pipeline | `/api/v1/pipelines/{id}` | ❌ |
| Get Pipeline by Name | `/api/v1/pipelines/name/{fqn}` | ❌ |
| List Topics | `/api/v1/topics` | ❌ |
| Get Topic | `/api/v1/topics/{id}` | ❌ |
| **Services** | | |
| List Database Services | `/api/v1/services/databaseServices` | ❌ |
| Get Database Service | `/api/v1/services/databaseServices/{id}` | ❌ |
| Get Database Service by Name | `/api/v1/services/databaseServices/name/{fqn}` | ❌ |
| Export Database Service | `/api/v1/services/databaseServices/name/{name}/export` | ❌ |
| Import Database Service | `/api/v1/services/databaseServices/name/{name}/import` | ❌ |
| List Dashboard Services | `/api/v1/services/dashboardServices` | ❌ |
| Get Dashboard Service | `/api/v1/services/dashboardServices/{id}` | ❌ |
| Get Dashboard Service by Name | `/api/v1/services/dashboardServices/name/{fqn}` | ❌ |
| **Teams & Users** | | |
| List Teams | `/api/v1/teams` | ❌ |
| Get Team | `/api/v1/teams/{id}` | ❌ |
| Get Team by Name | `/api/v1/teams/name/{fqn}` | ❌ |
| Export Team | `/api/v1/teams/name/{name}/export` | ❌ |
| Import Team | `/api/v1/teams/name/{name}/import` | ❌ |
| List Users | `/api/v1/users` | ❌ |
| Get User | `/api/v1/users/{id}` | ❌ |
| Get User by Name | `/api/v1/users/name/{name}` | ❌ |
| User Login | `/api/v1/users/login` | ❌ |
| User Logout | `/api/v1/users/logout` | ❌ |
| User Signup | `/api/v1/users/signup` | ❌ |
| Change Password | `/api/v1/users/changePassword` | ❌ |
| **Search** | | |
| Search Query | `/api/v1/search/query` | ❌ |
| Search Suggest | `/api/v1/search/suggest` | ❌ |
| Search Aggregate | `/api/v1/search/aggregate` | ❌ |
| Field Query | `/api/v1/search/fieldQuery` | ❌ |
| Get Document | `/api/v1/search/get/{index}/doc/{id}` | ❌ |
| **Tags & Classifications** | | |
| List Tags | `/api/v1/tags` | ❌ |
| Get Tag | `/api/v1/tags/{id}` | ❌ |
| Get Tag by Name | `/api/v1/tags/name/{fqn}` | ❌ |
| **Lineage** | | |
| Get Lineage | `/api/v1/lineage/getLineage` | ❌ |
| Export Lineage | `/api/v1/lineage/export` | ❌ |
| Get Entity Lineage by Name | `/api/v1/lineage/{entity}/name/{fqn}` | ❌ |
| Get Entity Lineage by ID | `/api/v1/lineage/{entity}/{id}` | ❌ |
| Get Lineage Edge | `/api/v1/lineage/getLineageEdge/{fromId}/{toId}` | ❌ |
| Add/Update Lineage | `/api/v1/lineage` | ❌ |
| Add/Update Lineage by FQN | `/api/v1/lineage/{fromEntity}/name/{fromFQN}/{toEntity}/name/{toFQN}` | ❌ |
| Add/Update Lineage by ID | `/api/v1/lineage/{fromEntity}/{fromId}/{toEntity}/{toId}` | ❌ |
| **Glossaries** | | |
| List Glossaries | `/api/v1/glossaries` | ❌ |
| Get Glossary | `/api/v1/glossaries/{id}` | ❌ |
| Get Glossary by Name | `/api/v1/glossaries/name/{fqn}` | ❌ |
| Export Glossary | `/api/v1/glossaries/name/{name}/export` | ❌ |
| Import Glossary | `/api/v1/glossaries/name/{name}/import` | ❌ |
| List Glossary Terms | `/api/v1/glossaryTerms` | ❌ |
| Get Glossary Term | `/api/v1/glossaryTerms/{id}` | ❌ |
| Get Glossary Term by Name | `/api/v1/glossaryTerms/name/{fqn}` | ❌ |
| Add Assets to Term | `/api/v1/glossaryTerms/{id}/assets/add` | ❌ |
| Remove Assets from Term | `/api/v1/glossaryTerms/{id}/assets/remove` | ❌ |
| Validate Term Tags | `/api/v1/glossaryTerms/{id}/tags/validate` | ❌ |
| **Usage** | | |
| Get Entity Usage by Name | `/api/v1/usage/{entity}/name/{fqn}` | ❌ |
| Get Entity Usage by ID | `/api/v1/usage/{entity}/{id}` | ❌ |
## Setup
### Environment Variables
Set one of the following authentication methods:
#### Token Authentication (Recommended)
```
OPENMETADATA_HOST=<your-openmetadata-host>
OPENMETADATA_JWT_TOKEN=<your-jwt-token>
```
#### Basic Authentication
```
OPENMETADATA_HOST=<your-openmetadata-host>
OPENMETADATA_USERNAME=<your-username>
OPENMETADATA_PASSWORD=<your-password>
```
### Usage with Claude Desktop
Add to your `claude_desktop_config.json` using one of the following authentication methods:
#### Token Authentication (Recommended)
```json
{
"mcpServers": {
"mcp-server-openmetadata": {
"command": "uvx",
"args": ["mcp-server-openmetadata"],
"env": {
"OPENMETADATA_HOST": "https://your-openmetadata-host",
"OPENMETADATA_JWT_TOKEN": "your-jwt-token"
}
}
}
}
```
#### Basic Authentication
```json
{
"mcpServers": {
"mcp-server-openmetadata": {
"command": "uvx",
"args": ["mcp-server-openmetadata"],
"env": {
"OPENMETADATA_HOST": "https://your-openmetadata-host",
"OPENMETADATA_USERNAME": "your-username",
"OPENMETADATA_PASSWORD": "your-password"
}
}
}
}
```
Alternative configuration using `uv`:
#### Token Authentication (Recommended)
```json
{
"mcpServers": {
"mcp-server-openmetadata": {
"command": "uv",
"args": [
"--directory",
"/path/to/mcp-server-openmetadata",
"run",
"mcp-server-openmetadata"
],
"env": {
"OPENMETADATA_HOST": "https://your-openmetadata-host",
"OPENMETADATA_JWT_TOKEN": "your-jwt-token"
}
}
}
}
```
#### Basic Authentication
```json
{
"mcpServers": {
"mcp-server-openmetadata": {
"command": "uv",
"args": [
"--directory",
"/path/to/mcp-server-openmetadata",
"run",
"mcp-server-openmetadata"
],
"env": {
"OPENMETADATA_HOST": "https://your-openmetadata-host",
"OPENMETADATA_USERNAME": "your-username",
"OPENMETADATA_PASSWORD": "your-password"
}
}
}
}
```
Replace `/path/to/mcp-server-openmetadata` with the actual path where you've cloned the repository.
### Manual Execution
You can also run the server manually:
```bash
python src/server.py
```
Options:
- `--port`: Port to listen on for SSE (default: 8000)
- `--transport`: Transport type (stdio/sse, default: stdio)
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## License
MIT License