Koskamo

Dekadans MCP

An official MCP server provided by Dekadans that allows AI assistants to perform App Store Optimization tasks. It enables agents to track keyword rankings, check popularity and difficulty scores, find keyword ideas from competitors, and manage tracked apps across 175 App Store storefronts using a Streamable HTTP endpoint authenticated via bearer API key.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Dekadans MCP logo, by DekadansVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Dekadans
You need:A bearer key from your dashboardIf you do not have an account, create one first
MCP endpoint (Streamable HTTP)
https://dekadans.net/mcp
Vendor documentation

What you can do with it

  • Track daily App Store keyword rankings and popularity scores
  • Find keyword ideas from competitor app metadata
  • Check keyword difficulty and popularity without tracking
  • Add apps and keywords to the tracking dashboard programmatically

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
aso-saas 1.0.0
MCP protocol
2025-06-18
Tools
13 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

ASO keyword tracking workspace of the authenticated user. appId in tools is the local id from list_apps, not the App Store ID. Keywords are measured when added and refreshed automatically about once a day. position null means the app was not found in the returned search results (or it is a temporary app), not proof of absence from the store.

Tools

13 advertised

list_apps — List apps
Advertised by the server during the last successful anonymous check.
Advertised read-only

Tracked apps of the user.

list_apps input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {}
}
list_apps annotations
{
  "readOnlyHint": true
}
add_app — Add app
Advertised by the server during the last successful anonymous check.

Track an app by App Store ID; its name is looked up automatically. Omit appStoreId (and pass name) for a temporary app. Free plan: 1 app.

add_app input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "Defaults to the App Store name. Required for temporary apps."
    },
    "platform": {
      "enum": [
        "iphone",
        "ipad",
        "mac",
        "appletv",
        "realityDevice"
      ],
      "type": "string",
      "default": "iphone"
    },
    "homeStore": {
      "type": "string",
      "default": "us",
      "pattern": "^[a-z]{2}$",
      "description": "Store where the app is available; used to look it up"
    },
    "appStoreId": {
      "type": "string",
      "pattern": "^[1-9]\\d{0,19}$",
      "description": "Omit for a temporary (unpublished) app"
    }
  }
}
add_keywords — Add keywords
Advertised by the server during the last successful anonymous check.

Track up to 100 keywords for an app in a store and measure rank, popularity and difficulty. Plan limit on total tracked keywords (free: 10); a batch over the limit is rejected entirely.

add_keywords input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "appId",
    "store",
    "keywords"
  ],
  "properties": {
    "appId": {
      "type": "integer",
      "maximum": 9007199254740991,
      "description": "Local app id from list_apps, not the App Store ID",
      "exclusiveMinimum": 0
    },
    "store": {
      "type": "string",
      "pattern": "^[a-z]{2}$"
    },
    "keywords": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 200,
        "minLength": 1
      },
      "maxItems": 100,
      "minItems": 1
    }
  }
}
refresh_app_keywords — Refresh app keywords
Advertised by the server during the last successful anonymous check.

Measure all tracked keywords of an app now and append to history.

refresh_app_keywords input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "appId"
  ],
  "properties": {
    "appId": {
      "type": "integer",
      "maximum": 9007199254740991,
      "description": "Local app id from list_apps, not the App Store ID",
      "exclusiveMinimum": 0
    }
  }
}
get_app_keywords — Get app keywords
Advertised by the server during the last successful anonymous check.
Advertised read-only

Tracked keywords of an app with latest metrics.

get_app_keywords input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "appId"
  ],
  "properties": {
    "appId": {
      "type": "integer",
      "maximum": 9007199254740991,
      "description": "Local app id from list_apps, not the App Store ID",
      "exclusiveMinimum": 0
    }
  }
}
get_app_keywords annotations
{
  "readOnlyHint": true
}
get_keyword_history — Get keyword history
Advertised by the server during the last successful anonymous check.
Advertised read-only

Daily rank, popularity and difficulty history of one tracked keyword (keywordId from get_app_keywords), oldest first; days without a measurement are omitted. Free plan: last 7 days.

get_keyword_history input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "appId",
    "keywordId"
  ],
  "properties": {
    "days": {
      "anyOf": [
        {
          "type": "string",
          "const": "all"
        },
        {
          "type": "integer",
          "maximum": 3650,
          "minimum": 1
        }
      ],
      "default": 30,
      "description": "Days of history to return, or \"all\". Free plan: capped at 7."
    },
    "appId": {
      "type": "integer",
      "maximum": 9007199254740991,
      "description": "Local app id from list_apps, not the App Store ID",
      "exclusiveMinimum": 0
    },
    "keywordId": {
      "type": "integer",
      "maximum": 9007199254740991,
      "exclusiveMinimum": 0
    }
  }
}
get_keyword_history annotations
{
  "readOnlyHint": true
}
get_usage — Plan and usage
Advertised by the server during the last successful anonymous check.
Advertised read-only

Current plan, tracked apps, keywords and research calls in the current quota period (free: month, pro: day). A null limit means unlimited.

get_usage input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {}
}
get_usage annotations
{
  "readOnlyHint": true
}
search_app_store — App Store search
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Live App Store search for a keyword. Returns ranked apps and difficulty; with appStoreId also that app's ranking (null = not in the returned results). Counts toward the research quota.

search_app_store input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "term"
  ],
  "properties": {
    "term": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1
    },
    "limit": {
      "type": "integer",
      "default": 50,
      "maximum": 100,
      "minimum": 1
    },
    "store": {
      "type": "string",
      "default": "us",
      "pattern": "^[a-z]{2}$"
    },
    "platform": {
      "enum": [
        "iphone",
        "ipad",
        "mac",
        "appletv",
        "realityDevice"
      ],
      "type": "string",
      "default": "iphone"
    },
    "appStoreId": {
      "type": "string",
      "pattern": "^[1-9]\\d{0,19}$"
    }
  }
}
search_app_store annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
get_keyword_popularity — Keyword popularity
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Popularity scores for up to 100 keywords in a store, without tracking them. Counts toward the research quota.

get_keyword_popularity input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "terms"
  ],
  "properties": {
    "store": {
      "type": "string",
      "default": "us",
      "pattern": "^[a-z]{2}$"
    },
    "terms": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 200,
        "minLength": 1
      },
      "maxItems": 100,
      "minItems": 1
    }
  }
}
get_keyword_popularity annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
get_keyword_suggestions — Keyword suggestions
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Keyword ideas for an App Store app with popularity and difficulty for the selected platform. Counts toward the research quota.

get_keyword_suggestions input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "appStoreId"
  ],
  "properties": {
    "store": {
      "type": "string",
      "default": "us",
      "pattern": "^[a-z]{2}$"
    },
    "platform": {
      "enum": [
        "iphone",
        "ipad",
        "mac",
        "appletv",
        "realityDevice"
      ],
      "type": "string",
      "default": "iphone"
    },
    "appStoreId": {
      "type": "string",
      "pattern": "^[1-9]\\d{0,19}$"
    },
    "highPopularity": {
      "type": "boolean",
      "default": true
    }
  }
}
get_keyword_suggestions annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
get_most_searched_keywords — Most searched keywords
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

One page of the most searched keywords in a store, optionally for an App Store category id (e.g. 6013). Check `month`: data can be from an earlier month. Counts toward the research quota.

get_most_searched_keywords input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "page": {
      "type": "integer",
      "default": 1,
      "maximum": 10000,
      "minimum": 1
    },
    "limit": {
      "type": "integer",
      "default": 50,
      "maximum": 100,
      "minimum": 1
    },
    "store": {
      "type": "string",
      "default": "us",
      "pattern": "^[a-z]{2}$"
    },
    "category": {
      "type": "string",
      "pattern": "^\\d{1,10}$"
    }
  }
}
get_most_searched_keywords annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
get_competitor_keywords — Competitor keyword ideas
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Derives 1–3 word candidates from the top 10 competitors ranking for a keyword and returns those with popularity > 5, highest first. Pass your appStoreId to exclude your own app. Counts toward the research quota.

get_competitor_keywords input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "term"
  ],
  "properties": {
    "term": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1
    },
    "store": {
      "type": "string",
      "default": "us",
      "pattern": "^[a-z]{2}$"
    },
    "platform": {
      "enum": [
        "iphone",
        "ipad",
        "mac",
        "appletv",
        "realityDevice"
      ],
      "type": "string",
      "default": "iphone"
    },
    "appStoreId": {
      "type": "string",
      "pattern": "^[1-9]\\d{0,19}$"
    }
  }
}
get_competitor_keywords annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}
get_app_details — App details
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

App Store details (developer, rating, price, description, screenshots) for up to 50 App Store IDs. IDs not available in the store are omitted. Counts toward the research quota.

get_app_details input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "appStoreIds"
  ],
  "properties": {
    "store": {
      "type": "string",
      "default": "us",
      "pattern": "^[a-z]{2}$"
    },
    "appStoreIds": {
      "type": "array",
      "items": {
        "type": "string",
        "pattern": "^[1-9]\\d{0,19}$"
      },
      "maxItems": 50,
      "minItems": 1
    }
  }
}
get_app_details annotations
{
  "readOnlyHint": true,
  "openWorldHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1568 ms
95th percentile latency
1568 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1568 ms · metadata changed · 13 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http dekadans-mcp https://dekadans.net/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add dekadans-mcp --url https://dekadans.net/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable dekadans-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "dekadans-mcp": {
      "url": "https://dekadans.net/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "dekadans-mcp": {
      "type": "streamableHttp",
      "url": "https://dekadans.net/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start dekadans-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "dekadans-mcp": {
      "type": "http",
      "url": "https://dekadans.net/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http dekadans-mcp https://dekadans.net/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "dekadans-mcp": {
      "url": "https://dekadans.net/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "dekadans-mcp": {
      "serverUrl": "https://dekadans.net/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Dekadans MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Dekadans MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing