UnifiedDevKit-API
A comprehensive Model Context Protocol (MCP) service binder designed to interface with essential developer platforms—including GitLab, Jira, Confluence, YouTube, and Google Maps—to enable sophisticated, AI-driven information retrieval and workflow automation. It centrally manages secure interactions across these disparate services via user-supplied credentials and access tokens.
Author

athapong
Quick Info
Actions
Tags
UnifiedDevKit Server Implementation
This repository details the architecture for the UnifiedDevKit Server, a robust implementation adhering to the Model Context Protocol (MCP). It unifies access to various enterprise and public services like GitLab, Jira, Confluence, YouTube, and Google Maps, offering advanced, AI-assisted search and utility functions tailored for streamlining software development lifecycles.
Prerequisites
- A compatible Go runtime environment (version 1.23.2 or newer).
- Valid API authentication material (keys, tokens) for all desired external services.
Deployment Instructions
Automated Integration via Smithery
For seamless, guided installation suitable for Claude Desktop environments, utilize the Smithery utility:
bash npx -y @smithery/cli install @athapong/aio-mcp --client claude
Note: The Smithery CLI will prompt you interactively for all necessary configuration parameters and automate environment variable setup.
Manual Installation via Go Toolchain
To install the binary directly using go install, ensure your Go environment path variables are correctly established so that binaries land in a location discoverable by your system's PATH (typically $GOPATH/bin).
-
Verify/Configure GOPATH: Default location is usually
$HOME/goon Unix-like systems or%USERPROFILE%\goon Windows. -
Ensure PATH Inclusion: Confirm
$GOPATH/binis appended to your system'sPATH.
Linux/macOS Configuration Snippets (Add to ~/.bashrc or ~/.zshrc):
bash
export GOPATH=$HOME/go
export PATH="$PATH:$GOPATH/bin"
source ~/.bashrc # or equivalent reload command
Windows (PowerShell) Configuration Snippets: powershell
Verification Commands: bash go env GOPATH echo $PATH # Unix/Linux/macOS echo %PATH% # Windows CMD $env:PATH # Windows PowerShell
Final Installation Command: bash go install github.com/athapong/aio-mcp@latest
-
Credential Configuration: Define necessary secrets and configuration flags within a
.envfile: env ENABLE_TOOLS= QDRANT_HOST= ATLASSIAN_HOST= ATLASSIAN_EMAIL= GITLAB_HOST= GITLAB_TOKEN= BRAVE_API_KEY= ATLASSIAN_TOKEN= GOOGLE_AI_API_KEY= PROXY_URL= OPENAI_API_KEY= OPENAI_EMBEDDING_MODEL= DEEPSEEK_API_KEY= QDRANT_PORT= GOOGLE_TOKEN_FILE= GOOGLE_CREDENTIALS_FILE= QDRANT_API_KEY= USE_OLLAMA_DEEPSEEK= ENABLE_SSE= SSE_ADDR= SSE_BASE_PATH= -
Client Configuration (e.g., Claude Desktop): Specify the server execution details in your configuration file (e.g.,
claude_desktop_config.json): {claude_desktop_config.json} { "mcpServers": { "aio-mcp": { "command": "aio-mcp", "args": ["-env", "/path/to/.env", "-sse", "-sse-addr", ":8080", "-sse-base-path", "/mcp"],} } }
Alternatively, override environment parameters directly in the JSON structure (see extensive environment variable list below for overrides).
{ "mcpServers": { "aio-mcp": { "command": "aio-mcp", "env": { "ENABLE_TOOLS": "", "OPENAI_BASE_URL": "", "GOOGLE_AI_API_KEY": "", "GITLAB_TOKEN": "", "GITLAB_HOST": "", "QDRANT_HOST": "", "QDRANT_API_KEY": "",
"PROXY_URL": "",
"OPENAI_API_KEY": "",
"GOOGLE_TOKEN_FILE": "",
"GOOGLE_CREDENTIALS_FILE": "",
"ATLASSIAN_TOKEN": "",
"BRAVE_API_KEY": "",
"QDRANT_PORT": "",
"ATLASSIAN_HOST": "",
"ATLASSIAN_EMAIL": "",
"USE_OPENROUTER": "false", // Set to "true" to leverage OpenRouter for reasoning on `tool_use_plan`
"DEEPSEEK_API_KEY": "", // API key for Deepseek services
"OPENROUTER_API_KEY": "", // API key for OpenRouter
"DEEPSEEK_API_BASE": "", // Custom base URL for Deepseek if needed
"USE_OLLAMA_DEEPSEEK": "false", // Enables local Ollama inference for Deepseek (default: false)
"OLLAMA_URL": "http://localhost:11434" // Ollama endpoint address
}
}
} }
Operational Modes
The UnifiedDevKit Server supports two primary communication modalities:
-
Standard I/O (Default): Communication occurs via standard input and output streams, the conventional method for MCP clients like Claude Desktop.
-
Server-Sent Events (SSE) Mode: Activates an integrated HTTP listener for real-time, event-driven bidirectional communication, ideal for network-accessible clients or web applications.
Activating SSE Communication
SSE can be enabled through:
-
CLI Arguments: bash aio-mcp -sse -sse-addr ":8080" -sse-base-path "/mcp"
-
Environment Configuration (in
.env):
ENABLE_SSE=true SSE_ADDR=:8080 SSE_BASE_PATH=/mcp
When SSE is active, the server exposes these endpoints:
- Event Stream: {SSE_BASE_PATH}/sse (Default: /mcp/sse)
- Message Submission: {SSE_BASE_PATH}/message (Default: /mcp/message)
Tool Activation Control
The ENABLE_TOOLS environment variable, if present, dictates which functional groups are active. If left blank or unset, all tool groups are enabled by default.
Available Tool Groups:
gemini: Access to Gemini-based search.fetch: General HTTP retrieval utilities.brave_search: Integration with Brave Search.google_maps: Google Maps service access.confluence: Confluence knowledge management tools.youtube: YouTube interaction tools.jira: Jira issue and board management.gitlab: GitLab repository and MR operations.script: Secure command execution tools.rag: Retrieval-Augmented Generation (memory indexing/querying).deepseek: Enhanced reasoning utilizing Deepseek models (especially when paired with local Ollama viaUSE_OLLAMA_DEEPSEEK=true, defaulting todeepseek-r1:8b).
Tool Definitions
calendar_create_event
Registers a new appointment in Google Calendar.
Arguments:
- summary (String, Required): Event designation.
- description (String): Detailed notes.
- start_time (String, Required): RFC3339 start timestamp (e.g., 2023-12-25T09:00:00Z).
- end_time (String, Required): RFC3339 end timestamp.
- attendees (String): Email addresses of invitees, comma-separated.
calendar_list_events
Retrieves a schedule of forthcoming calendar entries.
Arguments:
- time_min (String): Start bound for search (defaults to current moment).
- time_max (String): End bound for search (defaults to one week from now).
- max_results (Number): Limit on returned events (default: 10).
calendar_update_event
Modifies details of an existing calendar entry.
Arguments:
- event_id (String, Required): Unique ID of the event.
- summary (String): Revised title.
- description (String): Revised description.
- start_time (String): New RFC3339 start time.
- end_time (String): New RFC3339 end time.
- attendees (String): Updated list of attendees.
calendar_respond_to_event
Submits an RSVP to a calendar invitation.
Arguments:
- event_id (String, Required): Target event identifier.
- response (String, Required): Acceptance status ("accepted", "declined", or "tentative").
confluence_search
Queries the Atlassian Confluence knowledge base.
Arguments:
- query (String, Required): Query expressed in Atlassian Confluence Query Language (CQL).
confluence_get_page
Fetches the raw content of a specified Confluence document.
Arguments:
- page_id (String, Required): The numerical or alphanumeric identifier of the page.
confluence_create_page
Generates a new document within a Confluence space.
Arguments:
- space_key (String, Required): Identifier for the target Confluence space.
- title (String, Required): Title for the new page.
- content (String, Required): Page body formatted in storage (XHTML).
- parent_id (String): Identifier of the parent page, if any.
confluence_update_page
Revises the content or title of an existing Confluence page.
Arguments:
- page_id (String, Required): Identifier of the page undergoing modification.
- title (String): New title.
- content (String): Updated body content (storage format).
- version_number (String): Required for optimistic locking control.
confluence_compare_versions
Generates a diff between two distinct versions of a Confluence page.
Arguments:
- page_id (String, Required): Target page identifier.
- source_version (String, Required): Initial version number for comparison.
- target_version (String, Required): Final version number for comparison.
deepseek_reasoning
Employs the Deepseek model for intricate, multi-stage analytical processing and decision support.
Arguments:
- question (String, Required): The specific problem or structured inquiry demanding deep analysis.
- context (String, Required): Operational context framing the inquiry within the MCP framework.
- knowledge (String): Auxiliary data including conversation history or structured knowledge base excerpts.
get_web_content
Retrieves raw textual data from a specified web Uniform Resource Locator (URL).
Arguments:
- url (String, Required): The fully qualified HTTP or HTTPS address.
gchat_list_spaces
Enumerates all accessible Google Chat rooms or direct message contexts.
gchat_send_message
Dispatches a text message to a designated Google Chat recipient (space or user).
Arguments:
- space_name (String, Required): Identifier/name of the destination chat room.
- message (String, Required): The body of the text to transmit.
ai_web_search
Performs an internet search leveraging Google's AI capabilities for up-to-the-minute data acquisition.
Arguments:
- question (String, Required): The query requiring current information.
- context (String, Required): Contextual explanation to refine Gemini's search intent.
gitlab_list_projects
Fetches a roster of GitLab repositories associated with a group.
Arguments:
- group_id (String, Required): The numerical ID of the GitLab group.
- search (String): Optional terms for filtering projects (space-escaped AND logic, e.g., "api+client").
gitlab_get_project
Retrieves metadata for a specific GitLab repository.
Arguments:
- project_path (String, Required): The full path identifier of the project.
gitlab_list_mrs
Lists pending or completed Merge Requests (MRs) for a repository.
Arguments:
- project_path (String, Required): Project identifier.
- state (String, Default: all): Filter by MR status ("opened", "closed", "merged").
gitlab_get_mr_details
Fetches comprehensive data for a particular Merge Request.
Arguments:
- project_path (String, Required): Project identifier.
- mr_iid (String, Required): Internal ID of the Merge Request.
gitlab_create_mr_note
Publishes a new commentary entry on a specified Merge Request.
Arguments:
- project_path (String, Required): Project identifier.
- mr_iid (String, Required): Internal ID of the Merge Request.
- comment (String, Required): The textual content of the note.
gitlab_get_file_content
Reads the contents of a file directly from a GitLab repository at a specified revision.
Arguments:
- project_path (String, Required): Project identifier.
- file_path (String, Required): Location of the file within the repo structure.
- ref (String, Required): The specific branch, tag, or commit hash.
gitlab_list_pipelines
Shows the execution history of CI/CD pipelines for a project.
Arguments:
- project_path (String, Required): Project identifier.
- status (String, Default: all): Filter by pipeline lifecycle status.
gitlab_list_commits
Retrieves a chronological log of commits within a date window.
Arguments:
- project_path (String, Required): Project identifier.
- since (String, Required): Start date in YYYY-MM-DD format.
- until (String): End date in YYYY-MM-DD format (defaults to today).
- ref (String, Required): Branch, tag, or SHA to inspect.
gitlab_get_commit_details
Retrieves granular information about a specific code change.
Arguments:
- project_path (String, Required): Project identifier.
- commit_sha (String, Required): The full SHA hash of the commit.
gitlab_list_user_events
Logs recent activity for a GitLab user across a time span.
Arguments:
- username (String, Required): Target GitLab user ID.
- since (String, Required): Start date (YYYY-MM-DD).
- until (String): End date (YYYY-MM-DD, defaults to today).
gitlab_list_group_users
Lists all member accounts belonging to a GitLab group.
Arguments:
- group_id (String, Required): Identifier for the group.
gitlab_create_mr
Initiates a new Merge Request between two branches.
Arguments:
- project_path (String, Required): Project identifier.
- source_branch (String, Required): Branch containing the changes.
- target_branch (String, Required): Branch receiving the changes.
- title (String, Required): Title for the MR.
- description (String): Detailed explanation for the MR.
gitlab_clone_repo
Performs a local clone or updates an existing checkout of a GitLab repository.
Arguments:
- project_path (String, Required): Project identifier.
- ref (String): Specific branch/tag to checkout (defaults to project default).
gmail_search
Queries the user's inbox using standard Gmail search operators.
Arguments:
- query (String, Required): The search string conforming to Gmail syntax.
gmail_move_to_spam
Flags specified messages as spam.
Arguments:
- message_ids (String, Required): A comma-delimited sequence of message identifiers.
gmail_create_filter
Establishes a new rule for automatic message handling in Gmail.
Arguments:
- from (String): Sender address criterion.
- to (String): Recipient address criterion.
- subject (String): Subject line criterion.
- query (String): Supplementary search criteria.
- add_label (Boolean): Action: Apply a label.
- label_name (String): Name of the label to apply (only used if add_label is true).
- mark_important (Boolean): Action: Flag as important.
- mark_read (Boolean): Action: Mark as read.
- archive (Boolean): Action: Skip inbox (archive).
gmail_list_filters
Retrieves a full inventory of existing Gmail filters.
gmail_list_labels
Retrieves a full inventory of existing Gmail labels.
gmail_delete_filter
Permanently removes a defined filter rule.
Arguments:
- filter_id (String, Required): Unique identifier of the filter to be purged.
gmail_delete_label
Permanently removes a label from the Gmail account.
Arguments:
- label_id (String, Required): Unique identifier of the label to be deleted.
jira_get_issue
Fetches comprehensive details for a single Jira ticket, including its current status, ownership, description, and permissible workflow transitions.
Arguments:
- issue_key (String, Required): The issue's unique reference (e.g., PROJ-456).
jira_search_issue
Executes a search across Jira using Jira Query Language (JQL), returning key issue attributes like title, status, assignment, and priority.
Arguments:
- jql (String, Required): The JQL search expression (e.g., 'project = DOCS AND priority > 2').
jira_list_sprints
Retrieves metadata (ID, name, status, dates) for all active and scheduled sprints on a specified Jira board.
Arguments:
- board_id (String, Required): The numerical ID of the target board.
jira_create_issue
Provisions a new issue ticket within a specified Jira project.
Arguments:
- project_key (String, Required): Project abbreviation (e.g., KP).
- summary (String, Required): Concise summary/title.
- description (String, Required): Detailed narrative of the problem/task.
- issue_type (String, Required): Type classification (e.g., Bug, Task, Story).
jira_update_issue
Applies modifications to an extant Jira issue. Supports partial updates, affecting only fields provided.
Arguments:
- issue_key (String, Required): The unique identifier of the issue.
- summary (String): New headline.
- description (String): Updated description text.
jira_list_statuses
Returns a mapping of all permissible workflow status identifiers and their human-readable names within a Jira project context.
Arguments:
- project_key (String, Required): Project abbreviation.
jira_transition_issue
Advances an issue to the next step in its workflow using a predefined transition identifier. (Refer to jira_get_issue for available IDs).
Arguments:
- issue_key (String, Required): Target issue reference.
- transition_id (String, Required): Identifier for the desired transition state.
- comment (String): Optional textual context for the transition.
RAG_memory_index_content
Persists or updates unstructured textual data into a designated vector memory collection.
Arguments:
- collection (String, Required): The target memory space name.
- filePath (String, Required): Source location identifier for the content.
- payload (String, Required): The raw text to be embedded.
- model (String): Embedding algorithm (defaults to text-embedding-3-large).
RAG_memory_index_file
Embeds the contents of a local file into a specified knowledge collection.
Arguments:
- collection (String, Required): Target memory space name.
- filePath (String, Required): Path to the local file.
RAG_memory_create_collection
Initializes a new, empty vector storage space for indexed data.
Arguments:
- collection (String, Required): Name for the new collection.
- model (String): Preferred embedding model (defaults to text-embedding-3-large).
RAG_memory_delete_collection
Permanently removes an entire vector storage space.
Arguments:
- collection (String, Required): Name of the collection to erase.
RAG_memory_list_collections
Displays all currently defined vector memory spaces.
RAG_memory_search
Queries an indexed collection using semantic similarity against the input text.
Arguments:
- collection (String, Required): The vector space to search within.
- query (String, Required): The keyword or phrase for the similarity search.
- model (String): Embedding algorithm (defaults to text-embedding-3-large).
RAG_memory_delete_index_by_filepath
Removes specific entries from a collection based on their original file path.
Arguments:
- collection (String, Required): Target memory space name.
- filePath (String, Required): Source file path used during indexing.
execute_comand_line_script
Executes shell commands in a secure, sandboxed environment, managing timeouts and capturing stdout/stderr. Supports various interpreters and environment paths based on security validation.
Arguments:
- content (String, Required): The script body to execute.
- interpreter (String, Default: /bin/sh): Path to the execution binary (subject to whitelist).
- working_dir (String): Directory context for execution (defaults to user home; path validated).
web_search
Queries the public internet via the Brave Search service.
Arguments:
- query (String, Required): The search term (max 400 characters/50 words).
- count (Number, Default: 5): Number of result snippets to return (range 1-20).
- country (String, Default: ALL): ISO country code for geo-filtering results.
sequentialthinking
Enables iterative, reflective problem decomposition and solution formulation. This tool encourages dynamic adjustment of reasoning steps, allowing for backtracking, hypothesis testing, and iterative refinement until a satisfactory conclusion is reached.
When to employ: - Deconstructing intricate tasks into granular phases. - Designing systems where initial assumptions may require revision. - Situations demanding adaptive analysis or course correction. - Problems with inherent ambiguity or unknown scope at inception. - Tasks requiring a staged, multi-step resolution process. - Maintaining context across extended analytical segments. - Filtering out extraneous data during deep processing.
Core Mechanics:
- The total_thoughts estimate is fluid and can be modified dynamically.
- Previous steps can be explicitly questioned or superseded.
- Iteration can continue beyond the initial estimate.
- Uncertainty should be documented, and alternative paths explored.
- Non-linear progression (branching/backtracking) is supported.
- A preliminary hypothesis must be formulated.
- The hypothesis must be validated against the accumulated chain of thought.
- The loop persists until the generated answer meets quality thresholds.
- The final output must present a singular, validated answer.
Protocol Adherence:
1. Establish a provisional thought count, remaining flexible to augment it.
2. Review and revise preceding steps as insights emerge.
3. Extend the thought sequence if the apparent resolution is premature.
4. Clearly articulate any ambiguities encountered.
5. Tag thoughts that represent revisions or new analytical branches.
6. Disregard data irrelevant to the current analytical juncture.
7. Formulate a solution hypothesis at an appropriate juncture.
8. Rigorously validate the hypothesis against the preceding thought steps.
9. Iterate until confidence in the result is high.
10. Deliver one definitive, correct final output.
11. Only terminate (nextThoughtNeeded: false) when the solution is fully validated and complete.
Arguments:
- thought (String, Required): The current analytical step (can be a revision, question, hypothesis, etc.).
- nextThoughtNeeded (Boolean, Required): Continuation flag.
- thoughtNumber (Number, Required): Sequential index of the current thought.
- totalThoughts (Number, Required): Current estimate of total steps required.
- isRevision (Boolean): Indicates if this step supersedes prior thinking.
- revisesThought (Number): Index of the thought being updated.
- branchFromThought (Number): Index marking the divergence point.
- branchId (String): Identifier for the specific analytical branch.
- needsMoreThoughts (Boolean): Flag indicating realization that more steps are required.
- result (String): The final concluding statement derived from this thought.
- summary (String): A concise summary of the present thought's contribution.
sequentialthinking_history
Retrieves the full record of steps taken within the current reflective analysis session.
Arguments:
- branchId (String): Optional filter to retrieve history belonging to a specific branch.
tool_manager
Utility for dynamically adjusting the active set of available MCP tools.
Arguments:
- action (String, Required): Operation: "list", "enable", or "disable".
- tool_name (String): The specific tool identifier to target for enabling/disabling.
tool_use_plan
Generates an optimized sequence of tool calls required to fulfill a user request.
Arguments:
- request (String, Required): The task description needing execution.
- context (String, Required): Environmental or situational context pertaining to the request.
youtube_transcript
Extracts synchronized closed captions or textual data from a specified YouTube video.
Arguments:
- video_id (String, Required): The unique YouTube video identifier.
youtube_update_video
Modifies the metadata (title, description, tags) of a user-managed video on YouTube.
Arguments:
- video_id (String, Required): Target video identifier.
- title (String, Required): New title string.
- description (String, Required): New descriptive text.
- keywords (String, Required): Comma-separated list of search tags.
- category (String, Required): Numerical category ID (reference YouTube API documentation).
youtube_get_video_details
Fetches comprehensive metadata (e.g., title, view count, publication date) for a given YouTube resource.
Arguments:
- video_id (String, Required): The unique YouTube identifier.
youtube_list_videos
Retrieves a paginated list of videos uploaded by a specific channel.
Arguments:
- channel_id (String, Required): Identifier for the content owner's channel.
- max_results (Number, Required): Upper limit on the number of videos returned.
WIKIPEDIA: XMLHttpRequest (XHR) is an Application Programming Interface (API) implemented as a JavaScript object. Its core functionality involves facilitating the transmission of Hypertext Transfer Protocol (HTTP) requests directly from a web browser to a remote web server. These methods permit browser-based applications to dispatch server requests asynchronously after the initial page load completes, subsequently receiving information in return. XHR is a foundational element of Ajax programming methodology. Before its widespread adoption, server interaction primarily relied on traditional hyperlink navigation and form submissions, actions that typically necessitated a full page refresh.
== Chronology ==
The underlying principle for XMLHttpRequest was first conceptualized in 2000 by the development team behind Microsoft Outlook. This concept was subsequently integrated into the Internet Explorer 5 browser release (1999). Crucially, the initial implementation did not utilize the standardized XMLHttpRequest name; developers instead invoked COM objects using identifiers such as ActiveXObject("Msxml2.XMLHTTP") or ActiveXObject("Microsoft.XMLHTTP"). By the time Internet Explorer 7 was released (2006), universal browser support for the XMLHttpRequest identifier had been established.
Today, XMLHttpRequest stands as the de facto protocol standard across all major browser engines, including Mozilla's Gecko (2002), Safari 1.2 (2004), and Opera 8.0 (2005).
=== Formal Standardization === The World Wide Web Consortium (W3C) officially issued a Working Draft specification for the XMLHttpRequest object on April 5, 2006. A subsequent Level 2 specification, incorporating advancements like event progress monitoring, cross-origin request facilitation, and byte stream handling, was published by the W3C on February 25, 2008. By late 2011, the Level 2 features were merged back into the primary specification document. In late 2012, responsibility for maintenance was transferred to the WHATWG, which now maintains the specification as a living document utilizing Web IDL notation.
== Operational Procedure == Constructing and dispatching a network request using XMLHttpRequest generally entails several distinct programming phases:
- Object Instantiation: Create an instance of the XMLHttpRequest object via its constructor.
- Request Definition: Invoke the
openmethod to define the request type (GET, POST, etc.), specify the target Uniform Resource Identifier (URI), and select between synchronous or asynchronous execution modes. - Asynchronous Listener Setup: For asynchronous operations, register an event listener to be triggered upon changes in the request's state.
- Transmission: Commence the actual data transfer by calling the
sendmethod. - Response Handling: Monitor the state changes via the registered listener. If data is successfully returned, it is typically stored in the
responseTextattribute. The object transitions to state 4, signifying completion ("done").
Beyond these core steps, XHR offers extensive configuration options for request control and response parsing. Custom HTTP headers can be appended to dictate server behavior. Payload data can be uploaded by passing it to the send call. Responses can be immediately parsed from JSON into native JavaScript objects or processed incrementally as they arrive, avoiding blocking waits. Furthermore, requests can be explicitly canceled or configured to time out if they exceed a set duration.
== Cross-Origin Interactions ==
In the nascent stages of the World Wide Web, the feasibility of cross-domain communication was severely constrained...
