MCP 2.0 migration guide
The 2.0 name of every 1.x MCP tool, the arguments that changed, and what does not change for a client.
Monghoul 2.0 ships version 2 of the MCP tool catalog. This page is for authors of MCP clients and for people who keep prompts or scripts that name 1.x tools. The page lists the new name of each tool and the arguments that changed.
What changed
- Every tool has a new name, except
discover_tools,enable_toolsanddisable_tools. The 77 tools of 2.0 carry every 1.x tool. The table below maps each 1.x name to the 2.0 tool that carries it. - A 1.x name runs nothing. 2.0 has no alias and no implicit translation. A call to
execute_queryanswers an error that namesquery_executeand this guide, and AI Activity shows the same text, so the user sees why the assistant stopped. - The server names its own map.
server_infoanswersrenamedTools, the same 1.x-to-2.0 map, so a client can read it from the server. - Arguments are strict. An argument the schema does not name is refused at input. In 1.x it was ignored.
- Two tools are new.
server_infoanswers the API version, the runtime generation, the operation ID format, the providers and the name map.resource_describedescribes a connection, a database or a collection, with what its provider can do. - A saved tool switch moves with its tool. On the first launch of 2.0, AI Access moves each saved switch to the 2.0 tools that carry its 1.x tool. A merged tool whose 1.x tools had different switches stays off and is marked for review, so a merge never turns on a tool the user turned off.
Setup does not change
The address, the token and the client snippets are the same as in 1.x. A client that connected to 1.x connects to 2.0 with no change, and lists the 2.0 tools. Only the tool names and arguments the client sends change.
Running a query
execute_query becomes query_execute, and the call names its operation.
1.x execute_query |
2.0 query_execute |
|---|---|
connectionId |
connectionId |
dbName |
request.database |
code |
request.text |
| (none) | request.version: 1, request.providerId: "mongodb", request.kind: "javascript" |
resultLimit |
limits.resultLimit |
title |
presentation.title |
| (none) | presentation.mode: "tab" or "headless" |
| (none) | operationId, required |
| (none) | waitMs, how long the call waits for a result before it answers accepted |
The operation ID is the runtimeGeneration from server_info, a dot, then 1 to 64 of A-Z a-z 0-9 _ -. Choose a new ID for each new query. Send the same ID again only to retry the same call:
an ID never runs twice, and a retry answers the first call’s state.
{
"operationId": "1Hq4faReE8.orders-by-status",
"connectionId": "N0yioPOMIcNG2o8eDoREA",
"request": {
"version": 1,
"providerId": "mongodb",
"kind": "javascript",
"database": "shop",
"text": "db.collection('orders').aggregate([{ $group: { _id: '$status', n: { $sum: 1 } } }])"
},
"limits": { "resultLimit": 100 }
}
The answer has a state:
completed: the run ended, with its outcome and the result bounded to 1 MiB.accepted: the run continues afterwaitMs. Polloperation_get, then readresult_get.review-required: the user’s approval policy holds the query for review. Polloperation_get.rejected: refused before it ran, witherror.code.
Reading a result
get_tab_result read a tab’s latest result. In 2.0 a result belongs to an operation.
result_get {operationId}reads that operation’s own result, never a later run of its tab. The envelope is{apiVersion, operationId, providerId, payloadAvailability, result, projection}.payloadAvailabilityislive,stored,suppressed(the connection keeps documents off disk and the app no longer holds them) orexpired.projection.completeis false when whole documents were left out to fit 1 MiB.operation_get {operationId}reads the state of a request:awaiting-review,running,completed,rejected,expiredorunknown. With nooperationIdit lists the requests that wait for the user or were decided recently. It replacescheck_approval.- To read a run the user started, take
latestOperationIdfromtab_getorworkspace_get.
Editing a tab
update_tab_code {tabId, code} becomes workspace_update {tabId, code, expectedRevision}. Send
the tab’s codeRevision from tab_get or workspace_get as expectedRevision. A stale revision
answers REQUEST_CONFLICT with the current code, so the client reads it again and does not write
over the user’s edit. tab_close refuses a tab with a running query or a pending review.
Connections
add_connection {name, uri, color, timeout}becomesprofile_create {profile}.profileis the input the connection editor saves: every field is present, withnullfor one that is not set, and each secret is{action: "set", value, persist}or{action: "keep"}. The answer is{id, name, color}, and no answer carries a secret.delete_connectionbecomesprofile_delete {connectionId, favorites}.favoritesis"keep"(the default: the saved queries stay with no connection) or{moveTo: connectionId}.sync_databasesandsync_collectionsbecome one tool,resource_list {connectionId, dbName}. WithoutdbNameit lists the databases; with it, the collections of that database.
Merged tools
| 1.x tools | 2.0 tool | The argument that tells them apart |
|---|---|---|
pin_collection, unpin_collection |
pin_set |
pinned: true or false |
navigate_to_connection, navigate_to_database, navigate_to_collection |
sidebar_reveal |
dbName and collectionName, each optional |
expand_in_sidebar, collapse_in_sidebar |
sidebar_set_expanded |
expanded: true or false |
split_panel, split_and_move_tab |
panel_split |
tabId, optional: with it the tab moves into the new panel |
list_running_tasks, get_task_progress |
operation_list |
operationId, optional |
get_tab_result, check_approval |
result_get, operation_get |
see “Reading a result” |
Errors
A failed call answers isError: true. A refusal with a code is JSON with status: "error" and
the code, such as PROFILE_NOT_FOUND, REQUEST_CONFLICT, TAB_UNAVAILABLE or
OPERATION_RUNNING; query_execute answers its refusals as state: "rejected" with error.code.
A connection of a database type this build cannot use answers PROVIDER_UNAVAILABLE, and one of a
type with no MongoDB tools answers CAPABILITY_UNAVAILABLE, before anything runs. A connection or
a database outside the scope the user set answers the text “Out of MCP scope”, which is a settings
decision and not a transient error. Other failures answer a sentence that says what went wrong.
Every 1.x name
The 82 tools of 1.x and the 2.0 tools that carry them. Three keep their names: discover_tools, enable_tools and disable_tools. server_info answers the same map in renamedTools.
| 1.x tool | 2.0 tool |
|---|---|
activate_tab |
tab_activate |
add_connection |
profile_create |
analyze_schema |
mongodb_schema_analyze |
calculate_collection_stats |
mongodb_collection_stats |
calculate_db_size |
mongodb_database_stats |
cancel_task |
operation_cancel |
check_approval |
operation_get |
clear_operation_logs |
activity_clear |
clone_collection |
mongodb_collection_copy |
clone_database |
mongodb_database_copy |
clone_tab |
tab_clone |
collapse_in_sidebar |
sidebar_set_expanded |
create_markdown_tab |
tab_open_markdown |
create_query_tab |
workspace_open |
create_sidebar_folder |
sidebar_folder_create |
create_theme |
theme_create |
delete_connection |
profile_delete |
delete_theme |
theme_delete |
detach_tab |
window_detach |
disable_tools |
disable_tools |
discover_tools |
discover_tools |
enable_tools |
enable_tools |
execute_query |
query_execute |
expand_in_sidebar |
sidebar_set_expanded |
find_join_path |
mongodb_map_join_path |
get_active_theme |
theme_get |
get_database_findings |
mongodb_map_findings |
get_database_map |
mongodb_map_get |
get_detached_windows |
window_list |
get_log_response_storage_config |
activity_capture_get |
get_replica_set_status |
mongodb_replica_status |
get_tab |
tab_get |
get_tab_result |
operation_get, result_get |
get_task_progress |
operation_list |
get_theme_schema |
theme_schema_get |
get_workspace |
workspace_get |
list_connections |
profile_list |
list_favorite_queries |
favorite_list |
list_operation_logs |
activity_list |
list_pinned_collections |
pin_list |
list_running_tasks |
operation_list |
list_sidebar_tree |
sidebar_tree_get |
list_themes |
theme_list |
move_sidebar_node |
sidebar_node_move |
move_tab_to_panel |
panel_move_tab |
navigate_to_collection |
sidebar_reveal |
navigate_to_connection |
sidebar_reveal |
navigate_to_database |
sidebar_reveal |
open_database_map |
mongodb_map_open |
pin_collection |
pin_set |
reattach_tab |
window_reattach |
remove_favorite_query |
favorite_remove |
remove_panel |
panel_remove |
remove_sidebar_node |
sidebar_node_remove |
remove_tab |
tab_close |
rename_sidebar_folder |
sidebar_folder_rename |
reorder_sidebar_nodes |
sidebar_node_reorder |
reorder_tabs |
tab_reorder |
resize_panels |
panel_resize |
restore_tab |
tab_restore |
save_chart_config |
chart_set |
save_favorite_query |
favorite_save |
scan_database_map |
mongodb_map_scan |
search_tabs |
tab_search |
set_active_theme |
theme_activate |
set_editor_split_size |
tab_set_split |
set_log_response_storage_config |
activity_capture_set |
set_relationship_verdict |
mongodb_map_set_verdict |
set_result_fullscreen |
tab_set_fullscreen |
show_toast |
toast_show |
split_and_move_tab |
panel_split |
split_panel |
panel_split |
sync_collections |
resource_list |
sync_databases |
resource_list |
sync_indexes |
mongodb_index_list |
test_connection |
profile_test |
toggle_sidebar |
sidebar_set_visible |
toggle_sidebar_folder_collapsed |
sidebar_folder_set_collapsed |
unpin_collection |
pin_set |
update_tab_code |
workspace_update |
update_theme |
theme_update |
update_window_bounds |
window_set_bounds |