Koskamo

mcp-x MCP

An open-source Model Context Protocol server written in Go that exposes the X (Twitter) API v2 to LLM agents. It provides 42 tools for reading and searching posts, managing users and lists, uploading media, and publishing content. It supports both stdio and HTTP transports and authenticates via OAuth 1.0a user context.

Package and access

Local package with source-attributed installation metadata. Koskamo does not execute packages during review.

mcp-x MCP logo, by Role1776Community listingLocal stdioSource reviewed; not executedPublished by Role1776
You need:OAuth 1.0a user context
Vendor documentation

What you can do with it

  • Search and read X posts
  • Publish posts to X
  • Manage users and lists
  • Upload media to X

Source and maintenance

Community listingRegistry 0.1.1
Maintenance checked

Packages and installation

Source-provided package data. Koskamo has not executed or live-probed this package.

https://github.com/Role1776/mcp-x/releases/download/v0.1.1/mcp-x_0.1.1_linux_arm64.mcpb 0.1.1

mcpbSHA-256 supplied
https://github.com/Role1776/mcp-x/releases/download/v0.1.1/mcp-x_0.1.1_linux_arm64.mcpb package definition
{
  "version": "0.1.1",
  "transport": "stdio",
  "fileSha256": "bea4f1da09ae5f6fc2faeda8bf5d62d1323628b5e1360d1fe9f450596d8ecedb",
  "identifier": "https://github.com/Role1776/mcp-x/releases/download/v0.1.1/mcp-x_0.1.1_linux_arm64.mcpb",
  "registryType": "mcpb",
  "environmentVariables": [
    {
      "name": "X_API_KEY",
      "isRequired": true,
      "description": "OAuth 1.0a consumer key. developer.x.com -> your project -> your app -> Keys and tokens."
    },
    {
      "name": "X_API_KEY_SECRET",
      "isRequired": true,
      "description": "OAuth 1.0a consumer secret, issued together with X_API_KEY."
    },
    {
      "name": "X_ACCESS_TOKEN",
      "isRequired": true,
      "description": "User access token. Set the app permissions to Read and Write BEFORE generating it: a token keeps the permissions it was created with, and a read-only one fails every write until it is regenerated."
    },
    {
      "name": "X_ACCESS_TOKEN_SECRET",
      "isRequired": true,
      "description": "User access token secret, issued together with X_ACCESS_TOKEN."
    },
    {
      "name": "MEDIA_ROOT",
      "format": "filepath",
      "isRequired": true,
      "description": "Absolute path to an existing directory - the only one x_media_upload may read files from. Anything outside it is refused, symlinks included. Checked at startup.",
      "placeholder": "/tmp/mcp-x-media"
    },
    {
      "name": "MCP_TRANSPORT",
      "choices": [
        "stdio",
        "http"
      ],
      "default": "stdio",
      "description": "stdio (client spawns the process) or http (streamable HTTP listener)."
    },
    {
      "name": "MCP_NAME",
      "default": "mcp-x",
      "description": "Server name reported in the MCP initialize handshake."
    },
    {
      "name": "MCP_PATH",
      "default": "/mcp",
      "description": "HTTP path the MCP endpoint is served on. Used only when MCP_TRANSPORT=http."
    },
    {
      "name": "SERVER_PORT",
      "default": "8080",
      "description": "TCP port to listen on. Used only when MCP_TRANSPORT=http."
    },
    {
      "name": "SERVER_READ_TIMEOUT",
      "default": "60s",
      "description": "HTTP read timeout as a Go duration. Used only when MCP_TRANSPORT=http."
    },
    {
      "name": "SERVER_WRITE_TIMEOUT",
      "default": "60s",
      "description": "HTTP write timeout as a Go duration. Used only when MCP_TRANSPORT=http."
    },
    {
      "name": "LOG_MODE",
      "choices": [
        "local",
        "prod"
      ],
      "default": "local",
      "description": "local (text, debug) or prod (JSON, info). Logs go to stderr."
    },
    {
      "name": "MAX_IDLE_CONNS_PER_HOST",
      "format": "number",
      "default": "100",
      "description": "Idle connections the outbound HTTP client keeps per host."
    },
    {
      "name": "X_DEBUG",
      "format": "boolean",
      "choices": [
        "false",
        "true"
      ],
      "default": "false",
      "description": "Log the raw requests sent to the X API. Verbose; the output can contain request details, so keep it off outside debugging."
    },
    {
      "name": "POSTS_MAX_QUERIES",
      "format": "number",
      "default": "5",
      "description": "Queries accepted in one x_posts_search or x_posts_count call."
    },
    {
      "name": "POSTS_MAX_USERNAMES",
      "format": "number",
      "default": "5",
      "description": "Usernames accepted in one x_posts_by_user call."
    },
    {
      "name": "POSTS_MAX_IDS",
      "format": "number",
      "default": "100",
      "description": "Post ids accepted in one x_posts_lookup call. The X API caps this at 100."
    },
    {
      "name": "POSTS_DEFAULT_RESULTS",
      "format": "number",
      "default": "10",
      "description": "Posts returned per query when the call does not ask for a count. Every post returned is billed."
    },
    {
      "name": "POSTS_MAX_RESULTS",
      "format": "number",
      "default": "100",
      "description": "Upper bound for posts per query. The X API caps this at 100."
    },
    {
      "name": "POSTS_DEFAULT_DAYS",
      "format": "number",
      "default": "7",
      "description": "How far back post searches look when the call does not say, in days."
    },
    {
      "name": "POSTS_MAX_DAYS",
      "format": "number",
      "default": "7",
      "description": "Furthest back a post search may look, in days. Recent search cannot exceed 7."
    },
    {
      "name": "POSTS_DEFAULT_TIMEOUT_MS",
      "format": "number",
      "default": "15000",
      "description": "Timeout for a posts call in milliseconds when the call does not request one."
    },
    {
      "name": "POSTS_MIN_TIMEOUT_MS",
      "format": "number",
      "default": "2000",
      "description": "Lowest timeout a posts call may request, in milliseconds."
    },
    {
      "name": "POSTS_MAX_TIMEOUT_MS",
      "format": "number",
      "default": "60000",
      "description": "Highest timeout a posts call may request, in milliseconds."
    },
    {
      "name": "USERS_MAX_USERNAMES",
      "format": "number",
      "default": "100",
      "description": "Usernames accepted in one x_users_lookup call. The X API caps this at 100."
    },
    {
      "name": "USERS_MAX_IDS",
      "format": "number",
      "default": "100",
      "description": "User ids accepted in one x_users_lookup call. The X API caps this at 100."
    },
    {
      "name": "USERS_DEFAULT_RESULTS",
      "format": "number",
      "default": "100",
      "description": "Users returned per page when the call does not ask for a count."
    },
    {
      "name": "USERS_MAX_RESULTS",
      "format": "number",
      "default": "1000",
      "description": "Upper bound for users per page."
    },
    {
      "name": "USERS_DEFAULT_TIMEOUT_MS",
      "format": "number",
      "default": "15000",
      "description": "Timeout for a users call in milliseconds when the call does not request one."
    },
    {
      "name": "USERS_MIN_TIMEOUT_MS",
      "format": "number",
      "default": "2000",
      "description": "Lowest timeout a users call may request, in milliseconds."
    },
    {
      "name": "USERS_MAX_TIMEOUT_MS",
      "format": "number",
      "default": "60000",
      "description": "Highest timeout a users call may request, in milliseconds."
    },
    {
      "name": "LISTS_DEFAULT_RESULTS",
      "format": "number",
      "default": "25",
      "description": "Items returned per list page when the call does not ask for a count."
    },
    {
      "name": "LISTS_MAX_RESULTS",
      "format": "number",
      "default": "100",
      "description": "Upper bound for items per list page. The X API caps this at 100."
    },
    {
      "name": "LISTS_DEFAULT_TIMEOUT_MS",
      "format": "number",
      "default": "15000",
      "description": "Timeout for a lists call in milliseconds when the call does not request one."
    },
    {
      "name": "LISTS_MIN_TIMEOUT_MS",
      "format": "number",
      "default": "2000",
      "description": "Lowest timeout a lists call may request, in milliseconds."
    },
    {
      "name": "LISTS_MAX_TIMEOUT_MS",
      "format": "number",
      "default": "60000",
      "description": "Highest timeout a lists call may request, in milliseconds."
    },
    {
      "name": "MEDIA_CHUNK_BYTES",
      "format": "number",
      "default": "4194304",
      "description": "Bytes per upload segment. The X APPEND endpoint caps a segment at 5 MB."
    },
    {
      "name": "MEDIA_POLL_INTERVAL_MS",
      "format": "number",
      "default": "2000",
      "description": "How often the upload status is polled while X transcodes a video, in milliseconds."
    },
    {
      "name": "MEDIA_DEFAULT_TIMEOUT_MS",
      "format": "number",
      "default": "120000",
      "description": "Timeout for a whole upload in milliseconds when the call does not request one."
    },
    {
      "name": "MEDIA_MIN_TIMEOUT_MS",
      "format": "number",
      "default": "5000",
      "description": "Lowest timeout an upload may request, in milliseconds."
    },
    {
      "name": "MEDIA_MAX_TIMEOUT_MS",
      "format": "number",
      "default": "600000",
      "description": "Highest timeout an upload may request, in milliseconds."
    }
  ]
}

Tools

Reported by the attributed source; not independently observed by Koskamo.

No tool definitions available.

Let your agent find its tools

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