A full-featured MCP server wrapping the Kaggle API — 21 tools across competitions, datasets, kernels, models, and discussions.
A full-featured MCP server wrapping the Kaggle API — 21 tools across competitions, datasets, kernels, models, and discussions.
Why kaggle-mcp?
Kaggle provides an official remote MCP server (https://www.kaggle.com/mcp). Here's how kaggle-mcp compares:
| Feature | kaggle-mcp | Kaggle Official MCP |
|---------|:----------:|:----------:|
| Total tools | 21 | ~15 |
| Discussions (search/list/detail/comments) | ✅ 4 tools | ❌ |
| Dataset creation & file upload | ✅ | ❌ |
| Architecture | Local (stdio) | Remote HTTP |
| Install | uvx kaggle-mcp-server | npx mcp-remote required |
| No remote MCP dependency | ✅ | ❌ |
| Auth | API token | OAuth 2.0 / token |
When to use kaggle-mcp: You need discussion tools, dataset creation/upload, or native stdio support without remote MCP dependency.
When to use the official MCP: You prefer OAuth 2.0 auth or want zero local installation.
Quick Navigation
| Section | Description | |---------|-------------| | Prerequisites | Kaggle API token setup | | Installation | uvx / pip / source | | Configuration | Claude Desktop, Claude Code, VS Code, Cursor | | Tools (21) | Competitions, Datasets, Kernels, Models, Discussions | | Debugging | MCP Inspector | | Development | Local development setup |
Prerequisites
A Kaggle API token is required. You can authenticate using either method:
Option A: API Token (recommended)
- Go to https://www.kaggle.com/settings → API → Create New API Token
- Set the environment variable:
export KAGGLE_API_TOKEN="KGAT_xxxxxxxxxxxx"
Option B: kaggle.json
Download the token file from Kaggle settings, it will be saved to ~/.kaggle/kaggle.json:
{"username": "your_username", "key": "your_api_key"}
Installation
Note: MCP servers are launched automatically by MCP clients (Claude Code, VS Code, etc.) — you don't need to run them manually in the terminal. The commands below are what the client uses under the hood.
Using uvx (recommended)
No installation needed. uvx will automatically download and run the server:
# Used by MCP clients internally; no need to run this yourself
uvx kaggle-mcp-server
Using pip
pip install kaggle-mcp-server
From source
git clone https://github.com/Galaxy-Dawn/kaggle-mcp.git
cd kaggle-mcp
uv sync
Configuration
Claude Desktop
Add to your claude_desktop_config.json:
Using uvx (recommended)
{
"mcpServers": {
"kaggle": {
"command": "uvx",
"args": ["kaggle-mcp-server"],
"env": {
"KAGGLE_API_TOKEN": "KGAT_xxxxxxxxxxxx"
}
}
}
}
Using pip
{
"mcpServers": {
"kaggle": {
"command": "python",
"args": ["-m", "kaggle_mcp.server"],
"env": {
"KAGGLE_API_TOKEN": "KGAT_xxxxxxxxxxxx"
}
}
}
}
Claude Code
claude mcp add kaggle -- uvx kaggle-mcp-server
Or add to your project's .mcp.json (not settings.json):
{
"mcpServers": {
"kaggle": {
"command": "uvx",
"args": ["kaggle-mcp-server"],
"env": {
"KAGGLE_API_TOKEN": "KGAT_xxxxxxxxxxxx"
}
}
}
}
VS Code
Add to .vscode/mcp.json (note: the key is "servers", not "mcpServers"):
{
"servers": {
"kaggle": {
"command": "uvx",
"args": ["kaggle-mcp-server"],
"env": {
"KAGGLE_API_TOKEN": "KGAT_xxxxxxxxxxxx"
}
}
}
}
Cursor
Add to .cursor/mcp.json:
{
"mcpServers": {
"kaggle": {
"command": "uvx",
"args": ["kaggle-mcp-server"],
"env": {
"KAGGLE_API_TOKEN": "KGAT_xxxxxxxxxxxx"
}
}
}
}
Tip: If you already have
KAGGLE_API_TOKENin your shell environment (e.g. in.bashrcor.zshrc), you can omit the"env"block.
Tools (21)
Competitions (6)
| Tool | Description |
|------|-------------|
| competitions_list | Search and list Kaggle competitions |
| competition_files | List data files for a competition |
| competition_download | Download competition data files |
| competition_submit | Submit predictions to a competition |
| competition_submissions | View submission history |
| competition_leaderboard | View leaderboard (top 20) |
Parameter details
-
competitions_list — Search and list Kaggle competitions.
- Inputs:
search(string, optional): Search term to filter competitions.category(string, optional): Filter by category (e.g.featured,research,playground).sort_by(string, optional): Sort order (latestDeadline,numberOfTeams,recentlyCreated).page(integer, optional): Page number for pagination. Default1.
- Returns: List of competitions with title, ref, category, deadline, and team count.
- Inputs:
-
competition_files — List data files for a competition.
- Inputs:
competition(string, required): Competition URL suffix (e.g.titanic).
- Returns: List of file names and sizes.
- Inputs:
-
competition_download — Download competition data files. Returns download URL.
- Inputs:
competition(string, required): Competition URL suffix.file_name(string, optional): Specific file to download. Empty for all files.
- Returns: Download URL.
- Inputs:
-
competition_submit — Submit predictions to a competition.
- Inputs:
competition(string, required): Competition URL suffix.blob_file_tokens(string, required): Blob file token from upload.message(string, required): Submission description message.
- Returns: Submission result details.
- Inputs:
-
competition_submissions — View submission history for a competition.
- Inputs:
competition(string, required): Competition URL suffix.
- Returns: List of submissions with date, score, status, and description.
- Inputs:
-
competition_leaderboard — View competition leaderboard (top 20).
- Inputs:
competition(string, required): Competition URL suffix.
- Returns: Top 20 team names and scores.
- Inputs:
Datasets (6)
| Tool | Description |
|------|-------------|
| datasets_list | Search and list Kaggle datasets |
| dataset_files | List files in a dataset |
| dataset_download | Download dataset files |
| dataset_metadata | Get dataset metadata |
| dataset_create | Create a new dataset |
| file_upload | Upload a file to Kaggle |
Parameter details
-
datasets_list — Search and list Kaggle datasets.
- Inputs:
search(string, optional): Search term.sort_by(string, optional): Sort order (hottest,votes,updated,active).file_type(string, optional): Filter by file type (csv,json,sqlite, etc).page(integer, optional): Page number. Default1.
- Returns: List of datasets with title, ref, size, and download count.
- Inputs:
-
dataset_files — List files in a dataset.
- Inputs:
owner(string, required): Dataset owner username.dataset_slug(string, required): Dataset slug name.
- Returns: List of file names and sizes.
- Inputs:
-
dataset_download — Download dataset files. Returns download URL.
- Inputs:
owner(string, required): Dataset owner username.dataset_slug(string, required): Dataset slug name.file_name(string, optional): Specific file. Empty for all.
- Returns: Download URL.
- Inputs:
-
dataset_metadata — Get dataset metadata.
- Inputs:
owner(string, required): Dataset owner username.dataset_slug(string, required): Dataset slug name.
- Returns: Dataset metadata dictionary.
- Inputs:
-
dataset_create — Create a new dataset. Use
file_uploadfirst to get file tokens.- Inputs:
owner(string, required): Owner username.slug(string, required): Dataset slug.title(string, required): Dataset title.file_tokens(string, optional): Comma-separated file tokens fromfile_upload.license_name(string, optional): License (e.g.CC0-1.0,CC-BY-SA-4.0). DefaultCC0-1.0.is_private(boolean, optional): Whether dataset is private. Defaulttrue.
- Returns: Creation result details.
- Inputs:
-
file_upload — Upload a file to Kaggle and get a token for
dataset_create.- Inputs:
file_name(string, required): File name (e.g.data.csv,config.json).content(string, required): File content as text.
- Returns: File token string.
- Inputs:
Kernels (3)
| Tool | Description |
|------|-------------|
| kernels_list | Search and list notebooks/kernels |
| kernel_pull | Get a notebook's source code |
| kernel_push | Push/save a notebook to Kaggle |
Parameter details
-
kernels_list — Search and list Kaggle notebooks/kernels.
- Inputs:
search(string, optional): Search term.competition(string, optional): Filter by competition.dataset(string, optional): Filter by dataset.sort_by(string, optional): Sort order (hotness,commentCount,dateCreated,dateRun,relevance,voteCount).page(integer, optional): Page number. Default1.
- Returns: List of kernels with title, ref, votes, and language.
- Inputs:
-
kernel_pull — Get a notebook's source code.
- Inputs:
user_name(string, required): Kernel owner username.kernel_slug(string, required): Kernel slug name.
- Returns: Kernel metadata and source code.
- Inputs:
-
kernel_push — Push/save a notebook to Kaggle.
- Inputs:
title(string, required): Notebook title.text(string, required): Notebook source code.language(string, optional): Language (python,r). Defaultpython.kernel_type(string, optional): Type (notebook,script). Defaultnotebook.is_private(boolean, optional): Whether notebook is private. Defaulttrue.
- Returns: Push result details.
- Inputs:
Models (2)
| Tool | Description |
|------|-------------|
| models_list | Search and list Kaggle models |
| model_get | Get detailed model information |
Parameter details
-
models_list — Search and list Kaggle models.
- Inputs:
search(string, optional): Search term.owner(string, optional): Filter by owner.sort_by(string, optional): Sort order (hotness,downloadCount,createTime,updateTime).page_size(integer, optional): Number of results per page. Default20.
- Returns: List of models with title and ref.
- Inputs:
-
model_get — Get detailed information about a specific model.
- Inputs:
owner(string, required): Model owner username.model_slug(string, required): Model slug/name.
- Returns: Model metadata dictionary.
- Inputs:
Discussions (4)
| Tool | Description |
|------|-------------|
| discussions_search | Search Kaggle discussions |
| discussions_list | List discussions for a competition/dataset |
| discussion_detail | Get discussion content by ID |
| discussion_comments | Get comments for a discussion |
Parameter details
-
discussions_search — Search Kaggle discussions.
- Inputs:
query(string, required): Search query string.page_size(integer, optional): Number of results (max 50). Default20.
- Returns: List of discussions with ID, title, and votes.
- Inputs:
-
discussions_list — List discussions for a competition or dataset.
- Inputs:
competition(string, optional): Competition slug to filter.dataset(string, optional): Dataset ref to filter.page_size(integer, optional): Number of results (max 50). Default20.
- Returns: List of discussions with ID, title, and votes.
- Inputs:
-
discussion_detail — Get discussion content by ID.
- Inputs:
discussion_id(integer, required): Numeric discussion ID.
- Returns: Discussion title, author, votes, forum, and body content.
- Inputs:
-
discussion_comments — Get comments for a discussion.
- Inputs:
discussion_id(integer, required): Numeric discussion ID.
- Returns: Link to discussion comments page.
- Inputs:
Debugging
You can use the MCP Inspector to debug the server:
npx @modelcontextprotocol/inspector uvx kaggle-mcp-server
The Inspector will provide a URL to access debugging tools in your browser.
Development
git clone https://github.com/Galaxy-Dawn/kaggle-mcp.git
cd kaggle-mcp
uv sync
Then configure the server in your MCP client using the local path, or test with MCP Inspector.
Contributing
Contributions are welcome! Please open an issue or submit a pull request on the GitHub repository.
License
This project is licensed under the MIT License. See the LICENSE file for details.