arcgis-mcp-bridge
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ARCPY_PYTHON_PATH | Yes | Path to the Python interpreter that can import arcpy and pydantic. Required. | |
| ARCGIS_MCP_LOG_FILE | No | Path to the log file. | |
| ARCGIS_MCP_LOG_LEVEL | No | Logging level (e.g., DEBUG, INFO, WARNING). | |
| ARCGIS_MCP_MAX_WORKERS | No | Maximum number of concurrent arcpy workers. Defaults to 2. | 2 |
| ARCGIS_MCP_SCRATCH_GDB | No | Default output workspace geodatabase path. Must exist if set. | |
| ARCGIS_MCP_TOOL_TIMEOUT | No | Per-job timeout in seconds. | |
| ARCGIS_MCP_ALLOWED_ROOTS | No | Semicolon-separated list of allowed root directories for PathGuard sandbox. Defaults to ~/Documents/ArcGIS/Projects. | ~/Documents/ArcGIS/Projects |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| health_checkA | Verify the full execution pipeline: server -> conda worker -> back. |
| list_layersA | List feature classes, tables and rasters inside a file geodatabase. |
| execute_spatial_toolA | Execute one allowlisted geoprocessing tool (Buffer_analysis, Clip_analysis). |
| create_feature_classB | Create an empty feature class inside an existing file geodatabase using ArcPy CreateFeatureclass. Use this to prepare a controlled output dataset with a chosen geometry type and optional WKID before loading, editing, or analysis. Reads the target geodatabase path inside a PathGuard allowed root and returns the created dataset. |
| delete_datasetA | Delete an existing feature class, table, raster, or geodatabase item using ArcPy Delete. This operation is irreversible and mutates local project data, so confirm=true is required. The target dataset must be inside a configured PathGuard allowed root. |
| copy_featuresA | Copy an existing feature class or layer to a new output feature class using ArcPy CopyFeatures. Use this to create a safe working copy while preserving geometry, attributes, schema, and spatial reference. Reads in_features and writes out_features inside PathGuard allowed roots; existing outputs require overwrite=true. |
| rename_datasetA | Rename an existing dataset within its current workspace using ArcPy Rename. Use this for controlled cleanup of intermediate feature classes, tables, or rasters. This mutates the workspace namespace but does not edit feature geometry or attribute values; the dataset path must be inside a PathGuard allowed root. |
| add_fieldA | Add one attribute field to an existing feature class or table using ArcPy AddField. Use this to prepare schema before imports, joins, calculations, or manual editing. Mutates the input dataset schema; the dataset must be inside a PathGuard allowed root. |
| delete_fieldA | Delete one or more fields from an existing feature class or table using ArcPy DeleteField. Use this only when unwanted attribute columns should be permanently removed. This mutates the input schema and drops data, so confirm=true is required. |
| calculate_fieldA | Calculate values for an existing field using ArcPy CalculateField. Use this for controlled attribute updates with ARCADE, SQL, or PYTHON3 expressions. The default ARCADE mode is preferred for LLM-facing workflows; PYTHON3 executes worker-side code and, like all value overwrites, requires confirm=true. |
| add_fields_batchA | Add multiple fields to an existing feature class or table in one operation using ArcPy AddFields. Use this to prepare a complete attribute schema before imports, calculations, joins, or QA/QC. Mutates the input dataset schema; field names, types, aliases, and lengths are validated before execution. |
| get_field_infoA | List field metadata for an existing feature class or table using ArcPy ListFields. Use this to inspect schema before calculating, deleting, joining, or exporting attributes. Returns field names, types, lengths, aliases, and nullable status without modifying data. |
| get_feature_countA | Return the row or feature count for an existing dataset using ArcPy GetCount. Use this as a lightweight validation step before and after geoprocessing, filtering, import, export, or QA/QC workflows. Reads one dataset inside a PathGuard allowed root and does not modify data. |
| describe_datasetA | Describe an existing feature class, table, raster, or geodatabase item using ArcPy Describe. Use this to inspect data type, geometry type, coordinate reference system, and extent before choosing an analysis tool. Reads metadata only and does not modify the dataset. |
| create_file_gdbA | Create a new file geodatabase using ArcPy CreateFileGDB. Use this to prepare a workspace for scratch outputs, copied data, imports, or project-specific analysis results. The parent folder must exist inside a PathGuard allowed root; the tool returns the created geodatabase path. |
| compact_gdbA | Compact an existing file geodatabase using ArcPy Compact. Use this as maintenance after heavy editing, deletion, or intermediate output cleanup to reclaim storage and improve geodatabase performance. Mutates the geodatabase storage layout but not feature content. |
| export_to_shapefileA | Export a feature class to shapefile format using ArcPy FeatureClassToShapefile. Use this when data must be shared with legacy GIS tools or systems that require shapefiles. Reads the input features and writes shapefile components into an existing output folder inside PathGuard allowed roots. |
| export_to_geojsonA | Export features to a WGS84 GeoJSON file using ArcPy FeaturesToJSON. Use this to share vector data with web maps, APIs, notebooks, or non-Esri tools. Reads in_features and writes an output .geojson file inside PathGuard allowed roots; existing files require overwrite=true. |
| import_from_geojsonA | Convert a GeoJSON file into an ArcGIS feature class using ArcPy JSONToFeatures. Use this to bring web, API, or exchange-format vector data into a geodatabase for ArcGIS analysis. Reads an input .geojson file and writes out_features inside PathGuard allowed roots; existing outputs require overwrite=true. |
| table_to_excelA | Export an attribute table or feature class table to an Excel workbook using ArcPy TableToExcel. Use this to share tabular GIS attributes with analysts, reports, or spreadsheet workflows. Reads the input table and writes an .xlsx file inside PathGuard allowed roots; existing files require overwrite=true. |
| excel_to_tableA | Import an Excel worksheet into a geodatabase table using ArcPy ExcelToTable. Use this to bring spreadsheet-based attributes, lookup tables, or external tabular data into ArcGIS. Reads an .xlsx workbook and writes a geodatabase table inside PathGuard allowed roots; existing outputs require overwrite=true. |
| feature_to_csvA | Export a feature class or table to a CSV file using ArcPy ExportTable. Use this to move attribute data into notebooks, data pipelines, reports, or non-GIS tools. Reads the input table or feature class and writes a .csv output inside PathGuard allowed roots; existing files require overwrite=true. |
| get_extentA | Return xmin, ymin, xmax, ymax, and CRS metadata for an existing dataset using ArcPy Describe().extent. Use this to understand spatial coverage before clipping, map export, fishnet creation, raster analysis, or spatial QA/QC. Reads metadata only and does not modify the dataset. |
| calculate_geometryA | Calculate area, length, perimeter, centroid, or point coordinate values into an attribute field using ArcPy CalculateGeometryAttributes. Use this to populate measurement fields for reporting, QA/QC, labeling, or downstream analysis. Mutates the input dataset by writing geometry values into the specified field. |
| add_xy_coordinatesA | Add or update POINT_X and POINT_Y coordinate fields on point features using ArcPy AddXY. Use this when point coordinates are needed for export, QA/QC, labeling, tabular analysis, or integration with non-GIS systems. Mutates the input dataset by adding or updating coordinate fields, so run it on an intended working dataset. |
| append_featuresA | Append rows from one or more feature classes or tables into an existing target dataset using ArcPy Append. Use this to load reviewed data, merge field-compatible updates, or add processed batches into a live target. This mutates the target dataset by inserting rows, so confirm=true is required. |
| repair_geometryA | Repair invalid feature geometry in place using ArcPy RepairGeometry. Use this after check_geometry reports geometry problems or before overlay, topology, network, or export operations that require valid shapes. This rewrites geometry and may delete null geometries, so confirm=true is required. |
| check_geometryA | Check a feature class for geometry problems using ArcPy CheckGeometry and write the findings to an output table. Use this as a non-mutating QA/QC step before repair_geometry, overlay, topology validation, conversion, or export. Reads the input features and writes a report table inside PathGuard allowed roots. |
| detect_feature_changesA | Detect spatial or attribute changes between updated features and a reference feature dataset using ArcPy DetectFeatureChanges. Use this for QA/QC, version comparison, update review, or identifying changed features within a search tolerance. Reads update_features and base_features and writes a new out_features change dataset without mutating the originals. |
| delete_identicalA | Delete duplicate rows from a feature class or table using ArcPy DeleteIdentical based on selected fields and optional geometry tolerance. Use this only on an intended working dataset to remove duplicate records. This operation is irreversible and mutates the input dataset, so confirm=true is required. |
| eliminate_polygon_partA | Remove small polygon holes or parts using ArcPy EliminatePolygonPart and write a cleaned output feature class. Use this for cartographic cleanup, removing sliver holes, or simplifying polygon interiors by area or percentage thresholds. Reads in_features and writes out_features without modifying the source dataset. |
| topology_checkA | Validate a geodatabase topology using ArcPy ValidateTopology. Use this to refresh topology rule validation after editing, appending, repair, or geometry cleanup workflows. Reads the topology dataset and returns validation metadata; inspect the topology error feature classes in ArcGIS Pro for rule violations. |
| list_layoutsA | List all layouts in a saved ArcGIS Pro .aprx project using arcpy.mp listLayouts. Use this to discover layout names, page sizes, and page units before exporting or modifying a layout. Reads the project only and does not save or mutate the .aprx file. |
| export_layout_pdfA | Export a selected ArcGIS Pro layout to a PDF file using layout.exportToPDF. Use this for print-ready map sheets, reports, submittals, or archival exports with controlled DPI and image quality. Reads the .aprx project and writes out_pdf inside PathGuard allowed roots; existing files require overwrite=true. |
| export_layout_pngA | Export a selected ArcGIS Pro layout to a PNG image using layout.exportToPNG. Use this for previews, portfolio images, web graphics, or presentation-ready map layouts with controlled DPI and optional transparency. Reads the .aprx project and writes out_png inside PathGuard allowed roots. |
| export_map_as_imageA | Export a map view directly to a PNG image using the map defaultView, without requiring a layout. Use this for quick map snapshots, previews, or automated image generation when a formal layout is unnecessary. Reads the .aprx project and writes out_png with the requested width, height, and resolution. |
| set_map_scaleA | Set the camera scale denominator for a selected layout map frame using arcpy.mp camera.scale. Use this before exporting a layout when the map must be fixed to a known scale such as 1:1000 or 1:50,000. This updates the .aprx project when save=true. |
| set_map_extent_from_layerA | Set a layout map frame extent to match a named layer using mf.getLayerExtent and mf.camera.setExtent. Use this before exporting a layout so the final map focuses on a dataset, study area, boundary, or analysis result. This changes the map frame camera and saves the .aprx project when save=true. |
| update_text_elementA | Update the text content of a named layout text element using arcpy.mp layout elements. Use this to automate titles, dates, subtitles, map numbers, project names, notes, or report labels before export. This modifies the selected layout and saves the .aprx project when save=true. |
| update_legendA | Add or remove a layer entry in a selected layout legend using arcpy.mp legend addItem or removeItem. Use this to synchronize legends with automated layer changes before exporting maps. This modifies the layout legend and saves the .aprx project when save=true. |
| set_layout_sizeA | Change the physical page width and height of a selected ArcGIS Pro layout using layout.pageWidth and layout.pageHeight. Use this to switch between sheet sizes, portfolio formats, report pages, or print/export templates. This modifies the layout and saves the .aprx project when save=true. |
| intersect_featuresA | Overlay two or more feature layers using ArcPy Intersect and write only the shared geometry to a new output feature class. Use this to find areas, lines, or points common to multiple datasets while preserving selected attributes. Reads all input feature paths and writes out_features inside PathGuard allowed roots. |
| union_featuresA | Overlay two or more polygon feature layers using ArcPy Union and write a new polygon feature class containing all combined areas. Use this to compare zoning, land-use, administrative, or planning layers while retaining attributes from each input. Reads input features and writes out_features inside PathGuard allowed roots. |
| erase_featuresA | Remove portions of input features that overlap an erase layer using ArcPy Erase. Use this for exclusion zones, masking restricted areas, or subtracting one geography from another. Reads the input and overlay feature paths and writes a new output feature class without modifying the source datasets. |
| dissolve_featuresA | Merge adjacent or overlapping features that share attribute values using ArcPy Dissolve. Use this to generalize boundaries, aggregate parcels, zones, roads, or other features by one or more dissolve fields. Reads in_features and writes a new dissolved output feature class inside PathGuard allowed roots. |
| merge_featuresA | Combine multiple compatible feature classes or layers into one output feature class using ArcPy Merge. Use this to assemble same-schema datasets from multiple sources, tiles, districts, or processing batches. Reads all input feature paths and writes one new output inside PathGuard allowed roots. |
| select_by_attributeA | Materialize a SQL attribute query into a new feature class using ArcPy Select. Use this when a stateless MCP workflow needs a saved subset rather than an in-memory layer selection. Reads in_features, applies where_clause, and writes the selected rows to out_features. |
| select_by_locationA | Materialize a spatial relationship selection into a new feature class using a MakeFeatureLayer, SelectLayerByLocation, and CopyFeatures pipeline. Use this to persist features that intersect, contain, are within, or are near another dataset. Writes the selected result to out_features and removes the temporary layer. |
| spatial_joinA | Join attributes from one feature layer to another based on spatial relationships using ArcPy SpatialJoin. Use this to count, summarize, or transfer nearby, contained, intersecting, or matching feature attributes into a new output feature class. Reads target_features and join_features and writes out_features inside PathGuard roots. |
| near_analysisA | Calculate nearest-neighbor distance from each input feature to nearby features using ArcPy Near. This mutates the input dataset by adding or updating NEAR_FID and NEAR_DIST fields, so confirm=true is required. Use a copied working dataset when exposing this workflow to an LLM or automated agent. |
| generate_near_tableB | Create a standalone proximity table between input features and near features using ArcPy GenerateNearTable. Use this to record nearest neighbors, distances, and candidate matches without modifying the source datasets. Reads input and near feature paths and writes a new out_table inside PathGuard allowed roots. |
| minimum_bounding_geometryB | Create bounding geometries around input features using ArcPy MinimumBoundingGeometry. Use this to generate convex hulls, envelopes, circles, or other summary shapes for features or groups. Reads in_features and writes a new output feature class with the requested geometry_type and grouping behavior. |
| feature_to_pointA | Create representative point features from polygons or lines using ArcPy FeatureToPoint. Use this to produce centroids or guaranteed inside points for labeling, joins, sampling, or simplified analysis. Reads in_features and writes a new point feature class to out_features. |
| feature_vertices_to_pointsA | Convert feature vertices to point features using ArcPy FeatureVerticesToPoints. Use this to extract endpoints, all vertices, midpoints, or dangle points from line or polygon geometry for QA/QC, network checks, and geometry inspection. Reads in_features and creates out_features inside PathGuard allowed roots. |
| multipart_to_singlepartA | Split multipart features into singlepart features using ArcPy MultipartToSinglepart. Use this before per-feature editing, counting, topology checks, joins, or analysis that requires one geometry part per row. Reads in_features and creates out_features without modifying the source dataset. |
| simplify_featuresA | Simplify polygon or polyline geometry using ArcPy SimplifyPolygon or SimplifyLine after detecting the input shape type. Use this to reduce vertex density for cartography, web export, performance, or scale-appropriate analysis. Writes a simplified output feature class and does not mutate the source features. |
| smooth_featuresB | Smooth polygon or polyline geometry using ArcPy SmoothPolygon or SmoothLine after detecting the input shape type. Use this for cartographic cleanup where angular boundaries or lines need a more generalized appearance. Writes a new smoothed output feature class without modifying the source dataset. |
| summarize_withinA | Summarize features that fall within polygon areas using ArcPy SummarizeWithin. Use this to count or aggregate points, lines, or polygons by administrative zones, grid cells, parcels, buffers, or service areas. Reads boundary polygons and summary features, then writes a new summarized output feature class. |
| frequency_analysisA | Count unique combinations of attribute values using ArcPy Frequency. Use this to profile categorical fields, detect duplicates, summarize classes, or prepare simple frequency tables for QA/QC and reporting. Reads an input table and writes a new output table inside PathGuard allowed roots. |
| statistics_analysisB | Calculate summary statistics for numeric or categorical fields using ArcPy Statistics. Use this to aggregate counts, sums, means, minima, maxima, standard deviations, or grouped statistics before reporting or joining results back to features. Reads an input table and writes a new output table. |
| tabulate_intersectionB | Cross-tabulate intersections between zone features and class features using ArcPy TabulateIntersection. Use this to quantify how much of each class falls inside each zone, such as land-use area by district or habitat type by planning unit. Writes a standalone output table. |
| identity_featuresA | Overlay input features with identity features using ArcPy Identity. Use this to transfer polygon or line attributes onto another feature layer while preserving the input geometry where applicable. Reads both input datasets and writes a new output feature class inside PathGuard allowed roots. |
| symmetrical_differenceA | Create the non-overlapping parts of two feature layers using ArcPy SymmetricalDifference. Use this to compare boundaries, detect areas present in only one of two datasets, or isolate disagreement between two polygon/line sources. Writes a new output feature class and does not modify the inputs. |
| create_fishnetC | Create a regular rectangular grid or fishnet feature class using ArcPy CreateFishnet. Use this to build sampling grids, analysis cells, index maps, planning units, or raster-like vector zones from an origin, cell size, row/column count, and geometry type. Writes a new grid dataset inside a PathGuard allowed root. |
| add_layer_to_mapA | Add a dataset to a map inside an .aprx project (arcpy.mp addDataFromPath). Operates on the saved project file, not a live Pro session. |
| remove_layer_from_mapA | Remove a layer from a map (map.removeLayer). Requires confirm=true. |
| list_mapsB | List all map names inside an .aprx project (aprx.listMaps). |
| list_layers_in_mapB | List layers of one map with visibility, group flag and data source. |
| set_layer_visibilityA | Show or hide a layer (lyr.visible). |
| move_layer_orderB | Change draw order: move a layer BEFORE/AFTER a reference layer (map.moveLayer). |
| rename_layerB | Rename a layer as shown in the Contents pane (lyr.name). |
| zoom_to_layerC | Set the map's default camera to a layer's extent. |
| set_layer_symbologyC | Apply symbology from a .lyrx file (ApplySymbologyFromLayer). |
| save_projectB | Save the .aprx project file (aprx.save). |
| service_areaB | Reachable-area polygons around facilities at travel cutoffs (MakeServiceAreaAnalysisLayer). Requires Network Analyst. |
| route_analysisB | Best route through ordered stops (MakeRouteAnalysisLayer). Requires Network Analyst. |
| od_cost_matrixC | Origin-destination cost matrix lines (MakeODCostMatrixAnalysisLayer). Requires Network Analyst. |
| closest_facilityB | Nearest facility routes per incident (MakeClosestFacilityAnalysisLayer). Requires Network Analyst. |
| define_projectionA | Assign a CRS (by WKID/EPSG) to a dataset with an unknown spatial reference (DefineProjection). Metadata-only; requires confirm=true. |
| project_featuresB | Transform a vector dataset into another CRS/datum (Project). |
| get_spatial_referenceA | Look up a CRS by WKID: name, type, linear/angular units, datum. |
| project_rasterC | Reproject a raster with NEAREST/BILINEAR/CUBIC/MAJORITY resampling (ProjectRaster). |
| extract_by_maskA | Extract raster cells inside a polygon or raster mask using ArcPy Spatial Analyst ExtractByMask. Use this to clip elevation, imagery, land-cover, suitability, or other raster data to a study area before analysis. Requires a Spatial Analyst license; reads in_raster and mask inside PathGuard roots and writes out_raster. |
| raster_calculatorA | Run Spatial Analyst map algebra over explicitly named raster variables using ArcPy RasterCalculator. Use this for NDVI, suitability models, binary masks, raster normalization, and cell-by-cell formulas. Requires a Spatial Analyst license; expressions may reference only declared variable_names and validated map-algebra syntax. |
| resample_rasterB | Change raster cell size using ArcPy Resample. Use this to align resolution before overlay, modeling, visualization, or export. Reads one input raster and writes out_raster inside PathGuard roots; choose a resampling method appropriate for categorical or continuous data. |
| mosaic_to_new_rasterA | Merge multiple raster datasets into one new raster using ArcPy MosaicToNewRaster. Use this to combine tiles, scenes, DEM sheets, or image bands into a single dataset. Reads two or more input rasters and writes a named raster into an existing folder or geodatabase. |
| raster_to_polygonA | Convert raster zones or classes to polygon features using ArcPy RasterToPolygon. Use this to vectorize classified rasters, suitability classes, land-cover codes, or cell regions for GIS editing, overlay, and cartographic workflows. Reads in_raster and writes out_features. |
| polygon_to_rasterA | Convert polygon features to a raster dataset using ArcPy PolygonToRaster. Use this when vector zones, classes, parcels, or planning units need to become raster cells for map algebra, suitability modeling, or raster overlay. Reads polygon features and writes out_raster using value_field, cell_assignment, and cell_size. |
| zonal_statisticsA | Calculate one raster statistic per zone and write the result as a raster using ArcPy Spatial Analyst ZonalStatistics. Use this when each zone should receive a MEAN, SUM, MIN, MAX, or similar value from an input value raster. Requires a Spatial Analyst license. |
| zonal_statistics_as_tableA | Calculate zonal statistics and write the results to a standalone table using ArcPy Spatial Analyst ZonalStatisticsAsTable. Use this to summarize raster values by districts, parcels, watersheds, grid cells, or other zone datasets. Requires a Spatial Analyst license. |
| slope_analysisA | Derive slope from an elevation raster using ArcPy Spatial Analyst Slope. Use this in terrain, hydrology, accessibility, hazard, and site suitability workflows. Requires a Spatial Analyst license; writes a slope raster in degrees or percent rise using z_factor. |
| aspect_analysisA | Derive downslope aspect direction from an elevation raster using ArcPy Spatial Analyst Aspect. Use this for terrain interpretation, solar exposure, ecological modeling, hydrology, and site suitability. Requires a Spatial Analyst license and writes a new aspect raster. |
| hillshadeA | Create shaded relief from an elevation raster using ArcPy Spatial Analyst Hillshade. Use this for terrain visualization, map backdrops, and DEM QA/QC with controlled sun azimuth, altitude, shadow modeling, and z_factor. Requires a Spatial Analyst license. |
| contour_linesA | Create vector elevation isolines from a DEM raster using ArcPy Spatial Analyst Contour. Use this to generate cartographic contours, terrain analysis inputs, or elevation reference lines. Requires a Spatial Analyst license and writes a polyline feature class. |
| flow_directionB | Derive a hydrologic flow-direction raster from an elevation or surface raster using ArcPy Spatial Analyst FlowDirection. Use this before flow accumulation, watershed delineation, drainage modeling, or stream extraction. Requires a Spatial Analyst license; writes out_raster and can optionally force edge cells to flow outward. |
| fill_sinksA | Fill sinks or depressions in an elevation raster using ArcPy Spatial Analyst Fill. Use this to hydrologically condition DEMs before flow direction, flow accumulation, watershed, or stream network analysis. Requires a Spatial Analyst license; optional z_limit controls maximum sink depth to fill. |
| clip_rasterA | Clip a raster by rectangle, template extent, or template polygon geometry using ArcPy management Clip. Use this to crop imagery, DEMs, or classified rasters to a study area without requiring Spatial Analyst. Reads in_raster and optional template_dataset and writes out_raster inside PathGuard roots. |
| mean_centerC | Geometric mean center of features, optionally weighted (MeanCenter). |
| directional_distributionC | Standard deviational ellipse of a point distribution (DirectionalDistribution). |
| kernel_densityC | Kernel density surface from points/lines (sa.KernelDensity). Requires Spatial Analyst. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/muend/arcgis-mcp-bridge'
If you have feedback or need assistance with the MCP directory API, please join our Discord server