Skip to main content
Glama
ConnorBoetig-dev

Unrestricted Development MCP Server

index.ts22.9 kB
#!/usr/bin/env node import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js'; // Import tool definitions import { filesystemTools, readFile, writeFile, appendFile, deleteFile, listDirectory, createDirectory, deleteDirectory, getFileInfo, moveFile, copyFile, readFileSchema, writeFileSchema, appendFileSchema, deleteFileSchema, listDirectorySchema, createDirectorySchema, deleteDirectorySchema, getFileInfoSchema, moveFileSchema, copyFileSchema } from './tools/filesystem.js'; import { shellTools, executeCommand, executeStreamingCommand, executeCommandSchema, executeStreamingCommandSchema } from './tools/shell.js'; import { dockerTools, dockerPs, dockerLogs, dockerExec, dockerStart, dockerStop, dockerRestart, dockerInspect, dockerBuild, dockerImages, dockerPull, dockerComposeUp, dockerComposeDown, dockerComposePs, dockerComposeLogs, dockerRm, dockerRmi, dockerPsSchema, dockerLogsSchema, dockerExecSchema, dockerStartSchema, dockerStopSchema, dockerRestartSchema, dockerInspectSchema, dockerBuildSchema, dockerImagesSchema, dockerPullSchema, dockerComposeUpSchema, dockerComposeDownSchema, dockerComposePsSchema, dockerComposeLogsSchema, dockerRmSchema, dockerRmiSchema } from './tools/docker.js'; import { mongodbTools, mongodbConnect, mongodbFind, mongodbFindOne, mongodbInsertOne, mongodbInsertMany, mongodbUpdateOne, mongodbUpdateMany, mongodbDeleteOne, mongodbDeleteMany, mongodbAggregate, mongodbCount, mongodbCreateCollection, mongodbDropCollection, mongodbCreateIndex, mongodbListIndexes, mongodbDropIndex, mongodbListDatabases, mongodbListCollections, mongodbStats, mongodbConnectSchema, mongodbFindSchema, mongodbFindOneSchema, mongodbInsertOneSchema, mongodbInsertManySchema, mongodbUpdateOneSchema, mongodbUpdateManySchema, mongodbDeleteOneSchema, mongodbDeleteManySchema, mongodbAggregateSchema, mongodbCountSchema, mongodbCreateCollectionSchema, mongodbDropCollectionSchema, mongodbCreateIndexSchema, mongodbListIndexesSchema, mongodbDropIndexSchema, mongodbListDatabasesSchema, mongodbListCollectionsSchema, mongodbStatsSchema } from './tools/mongodb.js'; import { gitTools, gitStatus, gitAdd, gitCommit, gitDiff, gitLog, gitBranch, gitCheckout, gitPull, gitPush, gitClone, gitInit, gitMerge, gitRebase, gitFetch, gitRemote, gitStash, gitReset, gitRevert, gitTag, gitShow, gitConfig, gitStatusSchema, gitAddSchema, gitCommitSchema, gitDiffSchema, gitLogSchema, gitBranchSchema, gitCheckoutSchema, gitPullSchema, gitPushSchema, gitCloneSchema, gitInitSchema, gitMergeSchema, gitRebaseSchema, gitFetchSchema, gitRemoteSchema, gitStashSchema, gitResetSchema, gitRevertSchema, gitTagSchema, gitShowSchema, gitConfigSchema } from './tools/git.js'; import { processTools } from './tools/process.js'; import { networkTools, httpRequest, httpDownload, httpHealthCheck, networkPing, networkPortCheck, networkDnsLookup, networkCurl, networkNetstat, networkTraceroute, httpRequestSchema, httpDownloadSchema, httpHealthCheckSchema, networkPingSchema, networkPortCheckSchema, networkDnsLookupSchema, networkCurlSchema, networkNetstatSchema, networkTracerouteSchema } from './tools/network.js'; import { redisTools, redisConnect, redisGet, redisSet, redisDel, redisExists, redisKeys, redisTtl, redisExpire, redisHset, redisHget, redisHgetall, redisHdel, redisLpush, redisRpush, redisLrange, redisLpop, redisSadd, redisSmembers, redisSrem, redisIncr, redisDecr, redisFlushdb, redisInfo, redisDbsize, redisConnectSchema, redisGetSchema, redisSetSchema, redisDelSchema, redisExistsSchema, redisKeysSchema, redisTtlSchema, redisExpireSchema, redisHsetSchema, redisHgetSchema, redisHgetallSchema, redisHdelSchema, redisLpushSchema, redisRpushSchema, redisLrangeSchema, redisLpopSchema, redisSaddSchema, redisSmembersSchema, redisSremSchema, redisIncrSchema, redisDecrSchema, redisFlushdbSchema, redisInfoSchema, redisDbsizeSchema } from './tools/redis.js'; /** * MCP Server for Unrestricted Development Environment Access * * Provides AI with full access to: * - Filesystem (read/write/delete) * - Shell (unrestricted command execution with sudo) * - Docker (container management) * - MongoDB (database operations) * - Git (version control) * - Process management * - Network operations */ class UnrestrictedDevServer { private server: Server; constructor() { this.server = new Server( { name: 'unrestricted-dev-server', version: '1.0.0', }, { capabilities: { tools: {}, }, } ); this.setupHandlers(); this.setupErrorHandling(); } private setupErrorHandling(): void { this.server.onerror = (error) => { console.error('[MCP Error]', error); }; process.on('SIGINT', async () => { await this.server.close(); process.exit(0); }); } private setupHandlers(): void { // List all available tools this.server.setRequestHandler(ListToolsRequestSchema, async () => { return { tools: [ ...filesystemTools, ...shellTools, ...dockerTools, ...mongodbTools, ...redisTools, ...gitTools, ...processTools, ...networkTools ] }; }); // Handle tool execution this.server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; try { // Filesystem tools if (name === 'fs_read_file') { const validated = readFileSchema.parse(args); return await readFile(validated); } if (name === 'fs_write_file') { const validated = writeFileSchema.parse(args); return await writeFile(validated); } if (name === 'fs_append_file') { const validated = appendFileSchema.parse(args); return await appendFile(validated); } if (name === 'fs_delete_file') { const validated = deleteFileSchema.parse(args); return await deleteFile(validated); } if (name === 'fs_list_directory') { const validated = listDirectorySchema.parse(args); return await listDirectory(validated); } if (name === 'fs_create_directory') { const validated = createDirectorySchema.parse(args); return await createDirectory(validated); } if (name === 'fs_delete_directory') { const validated = deleteDirectorySchema.parse(args); return await deleteDirectory(validated); } if (name === 'fs_get_file_info') { const validated = getFileInfoSchema.parse(args); return await getFileInfo(validated); } if (name === 'fs_move_file') { const validated = moveFileSchema.parse(args); return await moveFile(validated); } if (name === 'fs_copy_file') { const validated = copyFileSchema.parse(args); return await copyFile(validated); } // Shell tools if (name === 'shell_execute') { const validated = executeCommandSchema.parse(args); return await executeCommand(validated); } if (name === 'shell_execute_streaming') { const validated = executeStreamingCommandSchema.parse(args); return await executeStreamingCommand(validated); } // Git tools if (name === 'git_status') { const validated = gitStatusSchema.parse(args); return await gitStatus(validated); } if (name === 'git_add') { const validated = gitAddSchema.parse(args); return await gitAdd(validated); } if (name === 'git_commit') { const validated = gitCommitSchema.parse(args); return await gitCommit(validated); } if (name === 'git_diff') { const validated = gitDiffSchema.parse(args); return await gitDiff(validated); } if (name === 'git_log') { const validated = gitLogSchema.parse(args); return await gitLog(validated); } if (name === 'git_branch') { const validated = gitBranchSchema.parse(args); return await gitBranch(validated); } if (name === 'git_checkout') { const validated = gitCheckoutSchema.parse(args); return await gitCheckout(validated); } if (name === 'git_pull') { const validated = gitPullSchema.parse(args); return await gitPull(validated); } if (name === 'git_push') { const validated = gitPushSchema.parse(args); return await gitPush(validated); } if (name === 'git_clone') { const validated = gitCloneSchema.parse(args); return await gitClone(validated); } if (name === 'git_init') { const validated = gitInitSchema.parse(args); return await gitInit(validated); } if (name === 'git_merge') { const validated = gitMergeSchema.parse(args); return await gitMerge(validated); } if (name === 'git_rebase') { const validated = gitRebaseSchema.parse(args); return await gitRebase(validated); } if (name === 'git_fetch') { const validated = gitFetchSchema.parse(args); return await gitFetch(validated); } if (name === 'git_remote') { const validated = gitRemoteSchema.parse(args); return await gitRemote(validated); } if (name === 'git_stash') { const validated = gitStashSchema.parse(args); return await gitStash(validated); } if (name === 'git_reset') { const validated = gitResetSchema.parse(args); return await gitReset(validated); } if (name === 'git_revert') { const validated = gitRevertSchema.parse(args); return await gitRevert(validated); } if (name === 'git_tag') { const validated = gitTagSchema.parse(args); return await gitTag(validated); } if (name === 'git_show') { const validated = gitShowSchema.parse(args); return await gitShow(validated); } if (name === 'git_config') { const validated = gitConfigSchema.parse(args); return await gitConfig(validated); } // Docker tools if (name === 'docker_ps') { const validated = dockerPsSchema.parse(args); return await dockerPs(validated); } if (name === 'docker_logs') { const validated = dockerLogsSchema.parse(args); return await dockerLogs(validated); } if (name === 'docker_exec') { const validated = dockerExecSchema.parse(args); return await dockerExec(validated); } if (name === 'docker_start') { const validated = dockerStartSchema.parse(args); return await dockerStart(validated); } if (name === 'docker_stop') { const validated = dockerStopSchema.parse(args); return await dockerStop(validated); } if (name === 'docker_restart') { const validated = dockerRestartSchema.parse(args); return await dockerRestart(validated); } if (name === 'docker_inspect') { const validated = dockerInspectSchema.parse(args); return await dockerInspect(validated); } if (name === 'docker_build') { const validated = dockerBuildSchema.parse(args); return await dockerBuild(validated); } if (name === 'docker_images') { const validated = dockerImagesSchema.parse(args); return await dockerImages(validated); } if (name === 'docker_pull') { const validated = dockerPullSchema.parse(args); return await dockerPull(validated); } if (name === 'docker_compose_up') { const validated = dockerComposeUpSchema.parse(args); return await dockerComposeUp(validated); } if (name === 'docker_compose_down') { const validated = dockerComposeDownSchema.parse(args); return await dockerComposeDown(validated); } if (name === 'docker_compose_ps') { const validated = dockerComposePsSchema.parse(args); return await dockerComposePs(validated); } if (name === 'docker_compose_logs') { const validated = dockerComposeLogsSchema.parse(args); return await dockerComposeLogs(validated); } if (name === 'docker_rm') { const validated = dockerRmSchema.parse(args); return await dockerRm(validated); } if (name === 'docker_rmi') { const validated = dockerRmiSchema.parse(args); return await dockerRmi(validated); } // Network/HTTP tools if (name === 'http_request') { const validated = httpRequestSchema.parse(args); return await httpRequest(validated); } if (name === 'http_download') { const validated = httpDownloadSchema.parse(args); return await httpDownload(validated); } if (name === 'http_health_check') { const validated = httpHealthCheckSchema.parse(args); return await httpHealthCheck(validated); } if (name === 'network_ping') { const validated = networkPingSchema.parse(args); return await networkPing(validated); } if (name === 'network_port_check') { const validated = networkPortCheckSchema.parse(args); return await networkPortCheck(validated); } if (name === 'network_dns_lookup') { const validated = networkDnsLookupSchema.parse(args); return await networkDnsLookup(validated); } if (name === 'network_curl') { const validated = networkCurlSchema.parse(args); return await networkCurl(validated); } if (name === 'network_netstat') { const validated = networkNetstatSchema.parse(args); return await networkNetstat(validated); } if (name === 'network_traceroute') { const validated = networkTracerouteSchema.parse(args); return await networkTraceroute(validated); } // MongoDB tools if (name === 'mongodb_connect') { const validated = mongodbConnectSchema.parse(args); return await mongodbConnect(validated); } if (name === 'mongodb_find') { const validated = mongodbFindSchema.parse(args); return await mongodbFind(validated); } if (name === 'mongodb_find_one') { const validated = mongodbFindOneSchema.parse(args); return await mongodbFindOne(validated); } if (name === 'mongodb_insert_one') { const validated = mongodbInsertOneSchema.parse(args); return await mongodbInsertOne(validated); } if (name === 'mongodb_insert_many') { const validated = mongodbInsertManySchema.parse(args); return await mongodbInsertMany(validated); } if (name === 'mongodb_update_one') { const validated = mongodbUpdateOneSchema.parse(args); return await mongodbUpdateOne(validated); } if (name === 'mongodb_update_many') { const validated = mongodbUpdateManySchema.parse(args); return await mongodbUpdateMany(validated); } if (name === 'mongodb_delete_one') { const validated = mongodbDeleteOneSchema.parse(args); return await mongodbDeleteOne(validated); } if (name === 'mongodb_delete_many') { const validated = mongodbDeleteManySchema.parse(args); return await mongodbDeleteMany(validated); } if (name === 'mongodb_aggregate') { const validated = mongodbAggregateSchema.parse(args); return await mongodbAggregate(validated); } if (name === 'mongodb_count') { const validated = mongodbCountSchema.parse(args); return await mongodbCount(validated); } if (name === 'mongodb_create_collection') { const validated = mongodbCreateCollectionSchema.parse(args); return await mongodbCreateCollection(validated); } if (name === 'mongodb_drop_collection') { const validated = mongodbDropCollectionSchema.parse(args); return await mongodbDropCollection(validated); } if (name === 'mongodb_create_index') { const validated = mongodbCreateIndexSchema.parse(args); return await mongodbCreateIndex(validated); } if (name === 'mongodb_list_indexes') { const validated = mongodbListIndexesSchema.parse(args); return await mongodbListIndexes(validated); } if (name === 'mongodb_drop_index') { const validated = mongodbDropIndexSchema.parse(args); return await mongodbDropIndex(validated); } if (name === 'mongodb_list_databases') { const validated = mongodbListDatabasesSchema.parse(args); return await mongodbListDatabases(validated); } if (name === 'mongodb_list_collections') { const validated = mongodbListCollectionsSchema.parse(args); return await mongodbListCollections(validated); } if (name === 'mongodb_stats') { const validated = mongodbStatsSchema.parse(args); return await mongodbStats(validated); } // Redis tools if (name === 'redis_connect') { const validated = redisConnectSchema.parse(args); return await redisConnect(validated); } if (name === 'redis_get') { const validated = redisGetSchema.parse(args); return await redisGet(validated); } if (name === 'redis_set') { const validated = redisSetSchema.parse(args); return await redisSet(validated); } if (name === 'redis_del') { const validated = redisDelSchema.parse(args); return await redisDel(validated); } if (name === 'redis_exists') { const validated = redisExistsSchema.parse(args); return await redisExists(validated); } if (name === 'redis_keys') { const validated = redisKeysSchema.parse(args); return await redisKeys(validated); } if (name === 'redis_ttl') { const validated = redisTtlSchema.parse(args); return await redisTtl(validated); } if (name === 'redis_expire') { const validated = redisExpireSchema.parse(args); return await redisExpire(validated); } if (name === 'redis_hset') { const validated = redisHsetSchema.parse(args); return await redisHset(validated); } if (name === 'redis_hget') { const validated = redisHgetSchema.parse(args); return await redisHget(validated); } if (name === 'redis_hgetall') { const validated = redisHgetallSchema.parse(args); return await redisHgetall(validated); } if (name === 'redis_hdel') { const validated = redisHdelSchema.parse(args); return await redisHdel(validated); } if (name === 'redis_lpush') { const validated = redisLpushSchema.parse(args); return await redisLpush(validated); } if (name === 'redis_rpush') { const validated = redisRpushSchema.parse(args); return await redisRpush(validated); } if (name === 'redis_lrange') { const validated = redisLrangeSchema.parse(args); return await redisLrange(validated); } if (name === 'redis_lpop') { const validated = redisLpopSchema.parse(args); return await redisLpop(validated); } if (name === 'redis_sadd') { const validated = redisSaddSchema.parse(args); return await redisSadd(validated); } if (name === 'redis_smembers') { const validated = redisSmembersSchema.parse(args); return await redisSmembers(validated); } if (name === 'redis_srem') { const validated = redisSremSchema.parse(args); return await redisSrem(validated); } if (name === 'redis_incr') { const validated = redisIncrSchema.parse(args); return await redisIncr(validated); } if (name === 'redis_decr') { const validated = redisDecrSchema.parse(args); return await redisDecr(validated); } if (name === 'redis_flushdb') { const validated = redisFlushdbSchema.parse(args); return await redisFlushdb(validated); } if (name === 'redis_info') { const validated = redisInfoSchema.parse(args); return await redisInfo(validated); } if (name === 'redis_dbsize') { const validated = redisDbsizeSchema.parse(args); return await redisDbsize(validated); } // TODO: Implement handlers for process tools throw new Error(`Unknown tool: ${name}`); } catch (error) { if (error instanceof Error) { return { content: [ { type: 'text' as const, text: JSON.stringify({ success: false, error: error.message, stack: error.stack }, null, 2) } ], isError: true }; } throw error; } }); } async run(): Promise<void> { const transport = new StdioServerTransport(); await this.server.connect(transport); console.error('Unrestricted Dev MCP Server running on stdio'); } } // Start the server const server = new UnrestrictedDevServer(); server.run().catch(console.error);

Implementation Reference

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ConnorBoetig-dev/mcp2'

If you have feedback or need assistance with the MCP directory API, please join our Discord server