{"id":55550,"date":"2026-10-02T15:17:21","date_gmt":"2026-10-02T22:17:21","guid":{"rendered":"https:\/\/www.griddb.net\/?p=55550"},"modified":"2026-10-02T15:17:21","modified_gmt":"2026-10-02T22:17:21","slug":"creating-a-griddb-mcp-server-for-crud-operations","status":"publish","type":"post","link":"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/","title":{"rendered":"Creating a GridDB MCP Server for CRUD Operations"},"content":{"rendered":"<p>\nModern AI systems increasingly rely on external tools, databases, and services, which makes interoperability a core requirement for building flexible applications. The Model Context Protocol (MCP) addresses this need by providing a standard way for applications to expose tools, resources, and prompts through a unified interface. When paired with <a href=\"https:\/\/griddb.net\/en\/\">GridDB\u2019s cloud API<\/a>, MCP allows developers to create reliable, reusable, and vendor-agnostic integrations for data operations.\n<\/p>\n<p>\nIn this article, you will learn how to build an MCP server for GridDB using the FastMCP library. We will walk through the complete workflow: project setup, environment configuration, defining tools for CRUD operations, and connecting the MCP server to an MCP client. By the end, you will have a fully functional GridDB MCP server that exposes database operations through a consistent, portable interface.\n<\/p>\n<p><strong>Note:<\/strong> The code for this article is available in this <a href=\"https:\/\/github.com\/usmanmalik57\/GridDB-Blogs\/tree\/main\/Creating%20GridDB%20MCP%20Server%20for%20CRUD%20Operations%20on%20GridDB\">GitHub repository<\/a>.<\/p>\n<p><strong>Prerequisites:<\/strong><\/p>\n<p>\nThe following are the prerequisites to run the code in this article.\n<\/p>\n<ul>\n<li>A <a href=\"https:\/\/www.global.toshiba\/ww\/products-solutions\/ai-iot\/griddb\/product\/griddb-cloud.html\">GridDB cloud account<\/a>. Refer to this <a href=\"https:\/\/griddb.net\/en\/blog\/griddb-cloud-quick-start-guide\/\">quick start guide<\/a> to find more information.<\/li>\n<li>An MCP client. You can create one or use <a href=\"https:\/\/www.claude.com\/download\">Claude Desktop<\/a> (the free version is enough for testing), as explained in this article.<\/li>\n<\/ul>\n<h2 id=\"what-is-mcp\">What is MCP<\/h2>\n<p>\nThe Model Context Protocol (MCP) is an open standard introduced by Anthropic to make it easier for applications and AI models to work with external tools and data. Instead of building custom integrations for every service, MCP provides a single, consistent way to expose actions, resources, and prompts.\n<\/p>\n<p>\nWith MCP, any server can publish capabilities, and any compatible client can use them without worrying about the underlying implementation. This creates a clean, reliable bridge between applications and the systems they need to interact with databases, APIs, files, or anything else.\n<\/p>\n<p>\nNext, you will see how to create an MCP server that allows you to insert a CSV file into the GridDB database and perform create, read, update, and delete operations on the dataset.\n<\/p>\n<h2 id=\"project-environment-setup\">Project &#038; Environment Setup<\/h2>\n<p>\nYou can create an MCP server from scratch. However, implementing various MCP standard protocols yourself could be cumbersome and error-prone, and can take a lot of time to bug.\n<\/p>\n<p>\nWith the growing popularity of MCP, various third-party modules and libraries have been developed to abstract its complexities, making it easier to set up your MCP server. <a href=\"https:\/\/gofastmcp.com\/getting-started\/welcome\">FastMCP<\/a> is one such MCP development library, which you will use in this article.\n<\/p>\n<p>\nFastMCP recommends using the <code>uv<\/code> package manager to install and manage its dependencies. Run the following script in your command terminal to install <code>uv<\/code> if you haven&#8217;t already.\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-plaintext\">pip install uv<\/code><\/pre>\n<\/div>\n<p>\nNext, create a folder that will contain your MCP server code. In this example, we name the folder <code>GRIDDB_MCP_SERVER<\/code>. Open the folder inside a code editor, e.g, VS Code and run the following command on the terminal:\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-plaintext\">uv init .<\/code><\/pre>\n<\/div>\n<p>\nThe above command will create a default project containing files such as <code>README.md<\/code>, <code>main.py<\/code>, <code>pyproject.toml<\/code>, etc.\n<\/p>\n<p>\nInstall the following three libraries that we will need to run the code in this article:\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-plaintext\">uv add fastmcp python-dotenv pandas<\/code><\/pre>\n<\/div>\n<p>\nNext, create a <code>.env<\/code> file in your project directory and set the GridDB username, password, and cluster URL as the following environment variables. The <code>.env<\/code> file is only needed for debugging. Later, when you use an MCP client to connect with your MCP servers, the client will pass its own environment variable, allowing multiple clients to connect with your MCP server.\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-plaintext\">username=GridDB_USERNAME\r\npassword=GridDB_PASSWORD\r\nbase_url=GridDB_CLUSTER_URL<\/code><\/pre>\n<\/div>\n<p>\nFinally, create a <code>griddb_tools.py<\/code> file to define tools for our MCP server.\n<\/p>\n<p>\nYour final project structure should look like this:\n<\/p>\n<p><a href=\"\/wp-content\/uploads\/2026\/10\/img1-project-structure.png\"><img fetchpriority=\"high\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/img1-project-structure.png\" alt=\"\" width=\"316\" height=\"281\" class=\"aligncenter size-full wp-image-55552\" srcset=\"\/wp-content\/uploads\/2026\/10\/img1-project-structure.png 316w, \/wp-content\/uploads\/2026\/10\/img1-project-structure-300x267.png 300w\" sizes=\"(max-width: 316px) 100vw, 316px\" \/><\/a><\/p>\n<h2 id=\"creating-tools\">Creating Tools<\/h2>\n<p>\nMCP servers have three main components:\n<\/p>\n<ul>\n<li><strong>Tools:<\/strong> Actions or functions the MCP server can perform when requested by the client.<\/li>\n<li><strong>Resources:<\/strong> Data or items the MCP server makes available for the client to access or read.<\/li>\n<li><strong>Resources:<\/strong> Prewritten text templates that the MCP server provides for generating consistent responses.<\/li>\n<\/ul>\n<p>\nIn most cases, tools are enough to create a functioning MCP server.\n<\/p>\n<p>\nFor the MCP server we are creating, we will define five tools. These tools are implemented as <code>async<\/code> Python functions in FastMCP.\n<\/p>\n<ol>\n<li><strong>insert_csv_to_griddb:<\/strong> which inserts data from a CSV file into a GridDB container.<\/li>\n<li><strong>get_container_columns:<\/strong> which returns the names of all the columns in a GridDB container.<\/li>\n<li><strong>sql_select_from_griddb:<\/strong> executes select (read) queries on a GridDB database.<\/li>\n<li><strong>sql_insert_update_griddb:<\/strong> executes the insert and update (create and update) queries on GridDB.<\/li>\n<li><strong>sql_delete_rows_griddb:<\/strong> which deletes a single or multiple rows from a GridDB database.<\/li>\n<\/ol>\n<p>\nNote that these are the same tools that we defined in <a href=\"https:\/\/github.com\/usmanmalik57\/GridDB-Blogs\/tree\/main\/Creating%20an%20SQL%20Agent%20for%20GridDB%20Using%20OpenAI%20%26%20DeepAgents%20Library\">our previous article<\/a>. However, in that article, we defined them inside a LangGraph DeepAgent. Anyone accessing those tools would have to write their own custom integrations. If a tool implementation changes on the DeepAgent side, the custom integration would need to be updated.\n<\/p>\n<p>\nIn this article, we will convert these tools into MCP server tools, shifting the responsibility for maintaining, updating, and modifying them to the vendor. The clients will always have the same uniform interface to access these tools.\n<\/p>\n<p>\nWe will add our tools to the <code>griddb_tools.py<\/code> file. Before adding any tool, add this code on top of the file:\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">import os\r\nimport base64\r\nimport json\r\nfrom pathlib import Path\r\n\r\nimport pandas as pd\r\nimport requests\r\nfrom dotenv import load_dotenv\r\n\r\nload_dotenv()\r\n\r\nusername = os.environ.get(&quot;username&quot;)\r\npassword = os.environ.get(&quot;password&quot;)\r\nbase_url = os.environ.get(&quot;base_url&quot;)\r\n\r\nif not all([username, password, base_url]):\r\n    raise RuntimeError(&quot;Missing env vars: username\/password\/base_url&quot;)\r\n\r\ncredentials = f&quot;{username}:{password}&quot;\r\nencoded_credentials = base64.b64encode(credentials.encode()).decode()\r\nheaders = {\r\n    &quot;Content-Type&quot;: &quot;application\/json&quot;,\r\n    &quot;Authorization&quot;: f&quot;Basic {encoded_credentials}&quot;,\r\n    &quot;User-Agent&quot;: &quot;PostmanRuntime\/7.29.0&quot;,\r\n}<\/code><\/pre>\n<\/div>\n<h3 id=\"insert-csv-to-griddb-tool\">Insert CSV to GridDB Tool<\/h3>\n<p>\nThis tool accepts a CSV file path and creates a container with the same name as the CSV file. It then inserts the records from the CSV file into the GridDB container.\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">async def insert_csv_to_griddb(csv_file_path: str) -&gt; str:\r\n\r\n    &quot;&quot;&quot;\r\n    This tool inserts data from a CSV file into the GridDB database.\r\n\r\n    Args:\r\n        csv_file_path (str): The path to the CSV file to be inserted.\r\n    &quot;&quot;&quot;\r\n\r\n    try:\r\n\r\n        if not os.path.isfile(csv_file_path):\r\n            return f&quot;Error: The file &#x27;{csv_file_path}&#x27; does not exist.&quot;\r\n\r\n        dataset = pd.read_csv(csv_file_path)\r\n\r\n        container_name = Path(csv_file_path).stem\r\n\r\n        ## =============================\r\n        ## Creating Container for GridDB\r\n        ## =============================\r\n\r\n        dataset.insert(0, &quot;SerialNo&quot;, dataset.index + 1)\r\n        dataset.columns.name = None   \r\n        # Mapping pandas dtypes to GridDB types\r\n        type_mapping = {\r\n            &quot;int64&quot;:          &quot;LONG&quot;,\r\n            &quot;float64&quot;:        &quot;DOUBLE&quot;,\r\n            &quot;bool&quot;:           &quot;BOOL&quot;,\r\n            &#x27;datetime64&#x27;: &quot;TIMESTAMP&quot;,\r\n            &quot;object&quot;:         &quot;STRING&quot;,\r\n            &quot;category&quot;:       &quot;STRING&quot;,\r\n        }\r\n\r\n        # Generate the columns part of the payload dynamically\r\n        columns = []\r\n        for col, dtype in dataset.dtypes.items():\r\n            griddb_type = type_mapping.get(str(dtype), &quot;STRING&quot;)  # Default to STRING if unknown\r\n            columns.append({\r\n                &quot;name&quot;: col,\r\n                &quot;type&quot;: griddb_type\r\n            })\r\n\r\n        url = f&quot;{base_url}\/containers&quot;\r\n        # Create the payload for the POST request\r\n        payload = json.dumps({\r\n            &quot;container_name&quot;: container_name,\r\n            &quot;container_type&quot;: &quot;COLLECTION&quot;,\r\n            &quot;rowkey&quot;: True,  # Assuming the first column as rowkey\r\n            &quot;columns&quot;: columns\r\n        })\r\n\r\n        # Make the POST request to create the container\r\n        response = requests.post(url, headers=headers, data=payload)\r\n\r\n        if response.status_code != 201:\r\n            return f&quot;Error creating container: {response.text}&quot;\r\n\r\n        ## =============================\r\n        ## Inserting data in the container\r\n        ## =============================\r\n\r\n\r\n        url = f&quot;{base_url}\/containers\/{container_name}\/rows&quot;\r\n\r\n        def format_row(row):\r\n            formatted = []\r\n            for item in row:\r\n                if pd.isna(item):\r\n                    formatted.append(None)  # Convert NaN to None\r\n                elif isinstance(item, bool):\r\n                    formatted.append(str(item).lower())  # Convert True\/False to true\/false\r\n                elif isinstance(item, (int, float)):\r\n                    formatted.append(item)  # Keep integers and floats as they are\r\n                else:\r\n                    formatted.append(str(item))  # Convert other types to string\r\n            return formatted\r\n\r\n        # Prepare rows with correct formatting\r\n        rows = [format_row(row) for row in dataset.values.tolist()]\r\n\r\n        # Create payload as a JSON string\r\n        payload = json.dumps(rows)\r\n\r\n        # Make the PUT request to add the rows to the container\r\n        response = requests.put(url, headers=headers, data=payload)\r\n\r\n        if response.status_code != 200:\r\n            return f&quot;Error inserting data: {response.text}&quot;                 \r\n\r\n\r\n        return f&quot;Data inserted successfully in the container {container_name}&quot;\r\n\r\n\r\n    except Exception as e:\r\n        return f&quot;Error: {str(e)}&quot;<\/code><\/pre>\n<\/div>\n<h3 id=\"get-container-columns-tools\">Get Container Columns Tools<\/h3>\n<p>\nThis tool retrieve column names from our GridDB container. Column names will provide MCP server with the information to call other tools.\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">\r\nasync def get_container_columns(container_name: str) -&gt; list[str] | str:\r\n\r\n    &quot;&quot;&quot;\r\n    Fetches one row from the container and tries to get column names from response metadata\r\n    Use this tool before executing any CRUD query to get the column names\r\n\r\n    Args:\r\n        container_name (str): Name of the container\/table to retrieve data\r\n    &quot;&quot;&quot;\r\n\r\n\r\n    try:\r\n        if not container_name:\r\n            return &quot;Error: container_name must be provided&quot;\r\n\r\n        url = f&quot;{base_url}\/containers\/{container_name}\/rows&quot;\r\n\r\n        payload = {\r\n            &quot;offset&quot;: 0,\r\n            &quot;limit&quot;: 1,\r\n            &quot;condition&quot;: &quot;&quot;,\r\n            &quot;sort&quot;: &quot;&quot;\r\n        }\r\n        response = requests.post(url, headers=headers, json=payload)\r\n        if response.status_code != 200:\r\n            return f&quot;Error fetching rows for container {container_name}: {response.status_code} {response.text}&quot;\r\n\r\n        data = response.json()\r\n\r\n        rows = data.get(&quot;rows&quot;, None)\r\n        if rows is None or len(rows) == 0:\r\n            return f&quot;No rows returned from container {container_name}&quot;\r\n\r\n        # Try to get \u201ccolumns\u201d metadata from response, if present\r\n        if &quot;columns&quot; in data and isinstance(data[&quot;columns&quot;], list):\r\n            cols_meta = data[&quot;columns&quot;]\r\n            # cols_meta: list of dicts with at least &quot;name&quot;\r\n            names = [col_meta.get(&quot;name&quot;, &quot;&quot;) for col_meta in cols_meta]\r\n            column_names = &quot;, &quot;.join(names)\r\n            return column_names\r\n\r\n    except Exception as e:\r\n        return f&quot;Error: {str(e)}&quot;<\/code><\/pre>\n<\/div>\n<h3 id=\"sql-select-from-griddb-tool\">SQL Select from GridDB Tool<\/h3>\n<p>\nThis tool accepts a container_name and the SQL query as parameters and returns the corresponding information from the GridDB.\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">\r\nasync def sql_select_from_griddb(container_name: str, sql_stmt: str) -&gt; str:\r\n    &quot;&quot;&quot;\r\n    Execute a SQL SELECT query on a GridDB Cloud container via Web API,\r\n    and return a formatted string of the results.\r\n\r\n    If the result is an aggregate (e.g. COUNT, SUM etc.) returning a single value,\r\n    returns something like &quot;Aggregate result: 42&quot;.\r\n\r\n    Otherwise, returns record by record detail.\r\n\r\n    Args:\r\n        container_name (str): Name of the container\/table to retrieve data\r\n        sql_stmt (str): The full SQL SELECT statement to execute.\r\n\r\n    Returns:\r\n        A string with formatted results or error message.\r\n    &quot;&quot;&quot;\r\n\r\n\r\n    try:\r\n        if not container_name:\r\n            return &quot;Error: container_name must be provided&quot;\r\n        if not sql_stmt.strip():\r\n            return &quot;Error: SQL statement must be provided&quot;\r\n\r\n        url = f&quot;{base_url}\/sql&quot;\r\n        payload = [\r\n            {\r\n                &quot;type&quot;: &quot;sql-select&quot;,\r\n                &quot;stmt&quot;: sql_stmt\r\n            }\r\n        ]\r\n        response = requests.post(url, headers=headers, json=payload)\r\n        if response.status_code != 200:\r\n            return f&quot;Error executing SQL: {response.status_code}, {response.text}&quot;\r\n\r\n        resp_json = response.json()\r\n        if not isinstance(resp_json, list) or len(resp_json) &lt; 1:\r\n            return f&quot;Unexpected response format: {resp_json}&quot;\r\n\r\n        first = resp_json[0]\r\n        columns_meta = first.get(&quot;columns&quot;)\r\n        results = first.get(&quot;results&quot;)\r\n\r\n        # Handle case of aggregate queries (when there are columns but rows are empty OR rows missing)\r\n        # Or when results is present but format is such that we have just one value\r\n        if columns_meta is not None and results is not None:\r\n            # If only one column and one row, could be an aggregate\r\n            if len(results) == 1 and len(columns_meta) == 1:\r\n                # e.g. [{&quot;name&quot;:&quot;count&quot;, &quot;type&quot;:&quot;LONG&quot;}] and [[42]]\r\n                col_name = columns_meta[0].get(&quot;name&quot;, &quot;value&quot;)\r\n                val = results[0][0]\r\n                return f&quot;{col_name}: {val}&quot;\r\n\r\n            # Otherwise, return record by record\r\n            output_lines = []\r\n            for idx, row in enumerate(results, start=1):\r\n                output_lines.append(f&quot;=============================&quot;)\r\n                output_lines.append(f&quot;Record {idx}&quot;)\r\n                for col_meta, cell in zip(columns_meta, row):\r\n                    col_name = col_meta.get(&quot;name&quot;, &quot;UnknownColumn&quot;)\r\n                    cell_str = &quot;None&quot; if cell is None else str(cell)\r\n                    output_lines.append(f&quot;{col_name}: {cell_str}&quot;)\r\n                output_lines.append(&quot;&quot;)  # blank line between records\r\n            output = &quot;\\n&quot;.join(output_lines)\r\n            return output\r\n\r\n\r\n        return f&quot;No usable result data found for query: {first}&quot;\r\n\r\n    except Exception as e:\r\n        return f&quot;Error: {e}&quot;<\/code><\/pre>\n<\/div>\n<h3 id=\"sql-insertupdate-griddb-tool\">SQL Insert\/Update GridDB Tool<\/h3>\n<p>\nThis tool inserts or updates existing data in a GridDB container. Like the <code>sql_select_from_griddb<\/code> tool, it accepts the container name and a valid SQL query as parameters.\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">async def sql_insert_update_griddb(container_name: str, sql_stmt: str) -&gt; str:\r\n    &quot;&quot;&quot;\r\n    Execute an SQL INSERT or UPDATE query on GridDB Cloud via Web API,\r\n    return a message indicating success or error.\r\n\r\n    Args:\r\n        container_name (str): Name of the container\/table (used for readability\/logging).\r\n        sql_stmt (str): The full SQL INSERT or UPDATE statement to execute.\r\n\r\n    Returns:\r\n        A string: either success message or error.\r\n    &quot;&quot;&quot;\r\n\r\n\r\n    try:\r\n        if not container_name:\r\n            return &quot;Error: container_name must be provided&quot;\r\n        if not sql_stmt.strip():\r\n            return &quot;Error: SQL statement must be provided&quot;\r\n\r\n        # Construct the URL for SQL update (inserts or updates)\r\n        url = f&quot;{base_url}\/sql\/update&quot;\r\n\r\n        payload = [\r\n            {\r\n                &quot;stmt&quot;: sql_stmt\r\n            }\r\n        ]\r\n\r\n        response = requests.post(url, headers=headers, json=payload)\r\n\r\n        if response.status_code != 200:\r\n            return f&quot;Error executing SQL update: {response.status_code}, {response.text}&quot;\r\n\r\n        # The response may or may not include useful JSON; check and return appropriate message\r\n        try:\r\n            resp_json = response.json()\r\n        except ValueError:\r\n            # Not JSON; maybe empty or plaintext\r\n            return f&quot;SQL update executed successfully for container &#x27;{container_name}&#x27;.&quot;\r\n\r\n        # If JSON and maybe return shows how many rows affected or similar\r\n        # Depending on what the API returns; adapt as needed\r\n        if isinstance(resp_json, list) and len(resp_json) &gt; 0:\r\n            # Some APIs give back something like [{&quot;count&quot;: N}] or status info\r\n            # Try to find a count or status field\r\n            first = resp_json[0]\r\n            if &quot;count&quot; in first:\r\n                return f&quot;Successfully updated\/inserted {first[&#x27;count&#x27;]} rows into &#x27;{container_name}&#x27;.&quot;\r\n            else:\r\n                # If no &#x27;count&#x27;, just return the JSON for debugging\r\n                return f&quot;SQL update successful. Response: {resp_json}&quot;\r\n        else:\r\n            return f&quot;SQL update successful into container &#x27;{container_name}&#x27;.&quot;\r\n\r\n    except Exception as e:\r\n        return f&quot;Error: {e}&quot;<\/code><\/pre>\n<\/div>\n<h3 id=\"sql-delete-rows-from-griddb\">SQL Delete Rows from GRIDDB<\/h3>\n<p>\nThis tool deletes data from a GridDB container.\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">\r\nasync def sql_delete_rows_griddb(container_name: str, row_keys: list, convert_to_int: bool = True) -&gt; str:\r\n    &quot;&quot;&quot;\r\n    Delete one or more rows from a GridDB container via Web API.\r\n\r\n    Args:\r\n        container_name (str): the container to delete from.\r\n        row_keys (list): list of rowkey values (as str or int). This can be retrieved by first calling the selectsql_select_from_griddb tool to get the rowkeys.\r\n        convert_to_int (bool): if True, try converting keys to ints, else keep as given.\r\n\r\n    Returns:\r\n        A message string: success or detailed error.\r\n    &quot;&quot;&quot;\r\n\r\n\r\n    try:\r\n        if not container_name:\r\n            return &quot;Error: container_name must be provided&quot;\r\n        if not row_keys or not isinstance(row_keys, list):\r\n            return &quot;Error: row_keys must be a non-empty list&quot;\r\n\r\n        # Convert types if needed\r\n        if convert_to_int:\r\n            # only convert those that are numeric strings\r\n            new_keys = []\r\n            for k in row_keys:\r\n                try:\r\n                    ki = int(k)\r\n                    new_keys.append(ki)\r\n                except Exception:\r\n                    # If conversion fails, keep original\r\n                    new_keys.append(k)\r\n            row_keys_to_use = new_keys\r\n        else:\r\n            row_keys_to_use = row_keys\r\n\r\n\r\n        url = f&quot;{base_url}\/containers\/{container_name}\/rows&quot;\r\n        response = requests.delete(url, headers=headers, json=row_keys_to_use)\r\n\r\n        # Acceptable success statuses\r\n        if response.status_code not in (200, 204):\r\n            return f&quot;Error deleting rows: {response.status_code}, {response.text}&quot;\r\n\r\n        return f&quot;Successfully requested delete of {len(row_keys_to_use)} row(s) from &#x27;{container_name}&#x27;.&quot;\r\n    except Exception as e:\r\n        return f&quot;Error: {e}&quot;<\/code><\/pre>\n<\/div>\n<h2 id=\"creating-griddb-mcp-server\">Creating GridDB MCP Server<\/h2>\n<p>\nCreating an MCP server with FastMCP is straightforward. Add the following code to the <code>main.py<\/code>:\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">from fastmcp import FastMCP\r\nfrom griddb_tools import (\r\n    insert_csv_to_griddb,\r\n    get_container_columns,\r\n    sql_select_from_griddb,\r\n    sql_insert_update_griddb,\r\n    sql_delete_rows_griddb,\r\n)\r\n\r\nmcp = FastMCP(name=&quot;GridDB MCP Server&quot;)\r\n\r\n# Register imported functions as tools\r\nmcp.tool()(insert_csv_to_griddb)\r\nmcp.tool()(get_container_columns)\r\nmcp.tool()(sql_select_from_griddb)\r\nmcp.tool()(sql_insert_update_griddb)\r\nmcp.tool()(sql_delete_rows_griddb)\r\n\r\nif __name__ == &quot;__main__&quot;:\r\n    mcp.run()<\/code><\/pre>\n<\/div>\n<p>\nThe above code creates an MCP server named <code>GridDB MCP Server<\/code> and adds the tools we defined to the server using the <code>mcp.tool()<\/code> decorator.\n<\/p>\n<p>\nExecute the following on your command terminal to see if your MCP server is running in debug mode:\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-plaintext\">uv run fastmcp dev main.py<\/code><\/pre>\n<\/div>\n<p>\nA new browser tab will open. Click the <code>Connect<\/code> button from the left sidebar and then click <code>Tools<\/code> from the top menu. You will see all your tools listed there:\n<\/p>\n<p><a href=\"\/wp-content\/uploads\/2026\/10\/img2-mcp-debug-server.png\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/img2-mcp-debug-server.png\" alt=\"\" width=\"1256\" height=\"825\" class=\"aligncenter size-full wp-image-55553\" srcset=\"\/wp-content\/uploads\/2026\/10\/img2-mcp-debug-server.png 1256w, \/wp-content\/uploads\/2026\/10\/img2-mcp-debug-server-300x197.png 300w, \/wp-content\/uploads\/2026\/10\/img2-mcp-debug-server-1024x673.png 1024w, \/wp-content\/uploads\/2026\/10\/img2-mcp-debug-server-768x504.png 768w, \/wp-content\/uploads\/2026\/10\/img2-mcp-debug-server-600x394.png 600w\" sizes=\"(max-width: 1256px) 100vw, 1256px\" \/><\/a><\/p>\n<h2 id=\"connection-mcp-client-to-mcp-server\">Connection MCP Client to MCP Server<\/h2>\n<p>\nYou can create a custom MCP client to access the MCP server. However, creating such a client is beyond the scope of this article. We add an MCP client to Claude Desktop.\n<\/p>\n<p>\nTo do so, type the following command:\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-plaintext\">uv run fastmcp install claude-desktop main.py<\/code><\/pre>\n<\/div>\n<p>\nRestart the Claude Desktop after running the above command. Go to <code>Settings -> Developers<\/code>, you should see <code>GridDB MCP Server<\/code> added in the list of MCP servers.\n<\/p>\n<p><a href=\"\/wp-content\/uploads\/2026\/10\/img3-claude-mcp-servers.png\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/img3-claude-mcp-servers.png\" alt=\"\" width=\"1173\" height=\"528\" class=\"aligncenter size-full wp-image-55554\" srcset=\"\/wp-content\/uploads\/2026\/10\/img3-claude-mcp-servers.png 1173w, \/wp-content\/uploads\/2026\/10\/img3-claude-mcp-servers-300x135.png 300w, \/wp-content\/uploads\/2026\/10\/img3-claude-mcp-servers-1024x461.png 1024w, \/wp-content\/uploads\/2026\/10\/img3-claude-mcp-servers-768x346.png 768w, \/wp-content\/uploads\/2026\/10\/img3-claude-mcp-servers-1170x528.png 1170w, \/wp-content\/uploads\/2026\/10\/img3-claude-mcp-servers-600x270.png 600w\" sizes=\"(max-width: 1173px) 100vw, 1173px\" \/><\/a><\/p>\n<p>\nClick the <code>Edit Config<\/code> button and open the <code>claude_desktop_json.config<\/code> file. Make sure your configuration file looks like this. Add the complete path to <code>uv<\/code> installation if in the <code>command<\/code> attribute if doesn&#8217;t already.\n<\/p>\n<p>\nAlso, add the environment variables for the MCP server. You can remove the <code>.env<\/code> file from your code directory at this point since the environment variables will be passed directly by the client now.\n<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-plaintext\">\r\n&quot;GridDB MCP Server&quot;: {\r\n  &quot;command&quot;: &quot;\/xxxx\/xxxx\/.local\/bin\/uv&quot;,\r\n  &quot;args&quot;: [\r\n    &quot;run&quot;,\r\n    &quot;--with&quot;,\r\n    &quot;fastmcp&quot;,\r\n    &quot;--directory&quot;,\r\n    &quot;\/xxxx\/xxxx\/GridDB_MCP_Server&quot;,\r\n    &quot;fastmcp&quot;,\r\n    &quot;run&quot;,\r\n    &quot;main.py&quot;\r\n  ],\r\n  &quot;env&quot;: {\r\n    &quot;username&quot;: &quot;GridDB_USERNAME&quot;,\r\n    &quot;password&quot;: &quot;GridDB_PASSWORD&quot;,\r\n    &quot;base_url&quot;: &quot;GRIDDB_CLUSTER_URL&quot;,\r\n    &quot;PYTHONUNBUFFERED&quot;: &quot;1&quot;\r\n  },\r\n  &quot;transport&quot;: &quot;stdio&quot;,\r\n  &quot;type&quot;: null,\r\n  &quot;cwd&quot;: null,\r\n  &quot;timeout&quot;: null,\r\n  &quot;description&quot;: null,\r\n  &quot;icon&quot;: null,\r\n  &quot;authentication&quot;: null\r\n}<\/code><\/pre>\n<\/div>\n<p>\nRestart the Claude Desktop again to test the MCP server.\n<\/p>\n<h2 id=\"testing-the-mcp-server\">Testing the MCP Server<\/h2>\n<p>\nLet&#8217;s run some tests to see if all our tools on the MCP server are working correctly.<br \/>\nOpen a new chat in Claude Desktop, run the following prompts, and see the results.\n<\/p>\n<h3 id=\"inserting-csv-to-griddb\">Inserting CSV to GridDB<\/h3>\n<p><a href=\"\/wp-content\/uploads\/2026\/10\/img4-mcp-test-insert-csv.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/img4-mcp-test-insert-csv.png\" alt=\"\" width=\"782\" height=\"660\" class=\"aligncenter size-full wp-image-55555\" srcset=\"\/wp-content\/uploads\/2026\/10\/img4-mcp-test-insert-csv.png 782w, \/wp-content\/uploads\/2026\/10\/img4-mcp-test-insert-csv-300x253.png 300w, \/wp-content\/uploads\/2026\/10\/img4-mcp-test-insert-csv-768x648.png 768w, \/wp-content\/uploads\/2026\/10\/img4-mcp-test-insert-csv-600x506.png 600w\" sizes=\"(max-width: 782px) 100vw, 782px\" \/><\/a><\/p>\n<h3 id=\"selecting-records-from-griddb\">Selecting Records from GridDB<\/h3>\n<p><a href=\"\/wp-content\/uploads\/2026\/10\/img5-mcp-test-select-record.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/img5-mcp-test-select-record.png\" alt=\"\" width=\"1770\" height=\"915\" class=\"aligncenter size-full wp-image-55556\" srcset=\"\/wp-content\/uploads\/2026\/10\/img5-mcp-test-select-record.png 1770w, \/wp-content\/uploads\/2026\/10\/img5-mcp-test-select-record-300x155.png 300w, \/wp-content\/uploads\/2026\/10\/img5-mcp-test-select-record-1024x529.png 1024w, \/wp-content\/uploads\/2026\/10\/img5-mcp-test-select-record-768x397.png 768w, \/wp-content\/uploads\/2026\/10\/img5-mcp-test-select-record-1536x794.png 1536w, \/wp-content\/uploads\/2026\/10\/img5-mcp-test-select-record-600x310.png 600w\" sizes=\"(max-width: 1770px) 100vw, 1770px\" \/><\/a><\/p>\n<h3 id=\"updating-records-in-griddb\">Updating Records in GridDB<\/h3>\n<p><a href=\"\/wp-content\/uploads\/2026\/10\/img6-mcp-test-update-record.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/img6-mcp-test-update-record.png\" alt=\"\" width=\"776\" height=\"813\" class=\"aligncenter size-full wp-image-55557\" srcset=\"\/wp-content\/uploads\/2026\/10\/img6-mcp-test-update-record.png 776w, \/wp-content\/uploads\/2026\/10\/img6-mcp-test-update-record-286x300.png 286w, \/wp-content\/uploads\/2026\/10\/img6-mcp-test-update-record-768x805.png 768w, \/wp-content\/uploads\/2026\/10\/img6-mcp-test-update-record-600x629.png 600w\" sizes=\"(max-width: 776px) 100vw, 776px\" \/><\/a><\/p>\n<h3 id=\"deleting-records-from-griddb\">Deleting Records from GridDB<\/h3>\n<p><a href=\"\/wp-content\/uploads\/2026\/10\/img7-mcp-test-delete-record.png\"><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/10\/img7-mcp-test-delete-record.png\" alt=\"\" width=\"782\" height=\"660\" class=\"aligncenter size-full wp-image-55558\" srcset=\"\/wp-content\/uploads\/2026\/10\/img7-mcp-test-delete-record.png 782w, \/wp-content\/uploads\/2026\/10\/img7-mcp-test-delete-record-300x253.png 300w, \/wp-content\/uploads\/2026\/10\/img7-mcp-test-delete-record-768x648.png 768w, \/wp-content\/uploads\/2026\/10\/img7-mcp-test-delete-record-600x506.png 600w\" sizes=\"(max-width: 782px) 100vw, 782px\" \/><\/a><\/p>\n<h2 id=\"conclusion\">Conclusion<\/h2>\n<p>\nThis article demonstrated how to build a complete GridDB MCP server using the FastMCP library. By turning database operations into MCP tools, you separate integration logic from the client side, making your GridDB operations reusable, maintainable, and accessible from any MCP-compatible environment.\n<\/p>\n<p>\nYou can find the complete code for this blog on the <a href=\"https:\/\/github.com\/usmanmalik57\/GridDB-Blogs\/tree\/main\/Creating%20GridDB%20MCP%20Server%20for%20CRUD%20Operations%20on%20GridDB\">GridDB Blogs GitHub repository<\/a>. In case of queries related to GridDB, create a post on Stack Overflow with the <code>griddb<\/code> tag.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Modern AI systems increasingly rely on external tools, databases, and services, which makes interoperability a core requirement for building flexible applications. The Model Context Protocol (MCP) addresses this need by providing a standard way for applications to expose tools, resources, and prompts through a unified interface. When paired with GridDB\u2019s cloud API, MCP allows developers [&hellip;]<\/p>\n","protected":false},"author":41,"featured_media":55558,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[121],"tags":[],"class_list":["post-55550","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Creating a GridDB MCP Server for CRUD Operations | GridDB: Open Source Time Series Database for IoT<\/title>\n<meta name=\"description\" content=\"Modern AI systems increasingly rely on external tools, databases, and services, which makes interoperability a core requirement for building flexible\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Creating a GridDB MCP Server for CRUD Operations | GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"og:description\" content=\"Modern AI systems increasingly rely on external tools, databases, and services, which makes interoperability a core requirement for building flexible\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/\" \/>\n<meta property=\"og:site_name\" content=\"GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/griddbcommunity\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-02T22:17:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.griddb.net\/wp-content\/uploads\/2026\/10\/img7-mcp-test-delete-record.png\" \/>\n\t<meta property=\"og:image:width\" content=\"782\" \/>\n\t<meta property=\"og:image:height\" content=\"660\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"griddb-admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:site\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"griddb-admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/\"},\"author\":{\"name\":\"griddb-admin\",\"@id\":\"https:\/\/www.griddb.net\/ja\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233\"},\"headline\":\"Creating a GridDB MCP Server for CRUD Operations\",\"datePublished\":\"2026-10-02T22:17:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/\"},\"wordCount\":1318,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.griddb.net\/ja\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2026\/10\/img7-mcp-test-delete-record.png\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/\",\"url\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/\",\"name\":\"Creating a GridDB MCP Server for CRUD Operations | GridDB: Open Source Time Series Database for IoT\",\"isPartOf\":{\"@id\":\"https:\/\/www.griddb.net\/ja\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2026\/10\/img7-mcp-test-delete-record.png\",\"datePublished\":\"2026-10-02T22:17:21+00:00\",\"description\":\"Modern AI systems increasingly rely on external tools, databases, and services, which makes interoperability a core requirement for building flexible\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/#primaryimage\",\"url\":\"\/wp-content\/uploads\/2026\/10\/img7-mcp-test-delete-record.png\",\"contentUrl\":\"\/wp-content\/uploads\/2026\/10\/img7-mcp-test-delete-record.png\",\"width\":782,\"height\":660},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.griddb.net\/ja\/#website\",\"url\":\"https:\/\/www.griddb.net\/ja\/\",\"name\":\"GridDB: Open Source Time Series Database for IoT\",\"description\":\"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL\",\"publisher\":{\"@id\":\"https:\/\/www.griddb.net\/ja\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.griddb.net\/ja\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.griddb.net\/ja\/#organization\",\"name\":\"Fixstars\",\"url\":\"https:\/\/www.griddb.net\/ja\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.griddb.net\/ja\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/griddb-linux-griddb-linux-clone-gnbah8a6f2fwd5eb.westus-01.azurewebsites.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"contentUrl\":\"https:\/\/griddb-linux-griddb-linux-clone-gnbah8a6f2fwd5eb.westus-01.azurewebsites.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"width\":200,\"height\":83,\"caption\":\"Fixstars\"},\"image\":{\"@id\":\"https:\/\/www.griddb.net\/ja\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/griddbcommunity\/\",\"https:\/\/x.com\/GridDBCommunity\",\"https:\/\/www.linkedin.com\/company\/griddb-by-toshiba\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.griddb.net\/ja\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233\",\"name\":\"griddb-admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.griddb.net\/ja\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g\",\"caption\":\"griddb-admin\"},\"url\":\"https:\/\/www.griddb.net\/en\/author\/griddb-admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Creating a GridDB MCP Server for CRUD Operations | GridDB: Open Source Time Series Database for IoT","description":"Modern AI systems increasingly rely on external tools, databases, and services, which makes interoperability a core requirement for building flexible","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/","og_locale":"en_US","og_type":"article","og_title":"Creating a GridDB MCP Server for CRUD Operations | GridDB: Open Source Time Series Database for IoT","og_description":"Modern AI systems increasingly rely on external tools, databases, and services, which makes interoperability a core requirement for building flexible","og_url":"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/","og_site_name":"GridDB: Open Source Time Series Database for IoT","article_publisher":"https:\/\/www.facebook.com\/griddbcommunity\/","article_published_time":"2026-10-02T22:17:21+00:00","og_image":[{"width":782,"height":660,"url":"https:\/\/www.griddb.net\/wp-content\/uploads\/2026\/10\/img7-mcp-test-delete-record.png","type":"image\/png"}],"author":"griddb-admin","twitter_card":"summary_large_image","twitter_creator":"@GridDBCommunity","twitter_site":"@GridDBCommunity","twitter_misc":{"Written by":"griddb-admin","Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/#article","isPartOf":{"@id":"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/"},"author":{"name":"griddb-admin","@id":"https:\/\/www.griddb.net\/ja\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233"},"headline":"Creating a GridDB MCP Server for CRUD Operations","datePublished":"2026-10-02T22:17:21+00:00","mainEntityOfPage":{"@id":"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/"},"wordCount":1318,"commentCount":0,"publisher":{"@id":"https:\/\/www.griddb.net\/ja\/#organization"},"image":{"@id":"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2026\/10\/img7-mcp-test-delete-record.png","articleSection":["Blog"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/","url":"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/","name":"Creating a GridDB MCP Server for CRUD Operations | GridDB: Open Source Time Series Database for IoT","isPartOf":{"@id":"https:\/\/www.griddb.net\/ja\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/#primaryimage"},"image":{"@id":"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2026\/10\/img7-mcp-test-delete-record.png","datePublished":"2026-10-02T22:17:21+00:00","description":"Modern AI systems increasingly rely on external tools, databases, and services, which makes interoperability a core requirement for building flexible","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.griddb.net\/en\/blog\/creating-a-griddb-mcp-server-for-crud-operations\/#primaryimage","url":"\/wp-content\/uploads\/2026\/10\/img7-mcp-test-delete-record.png","contentUrl":"\/wp-content\/uploads\/2026\/10\/img7-mcp-test-delete-record.png","width":782,"height":660},{"@type":"WebSite","@id":"https:\/\/www.griddb.net\/ja\/#website","url":"https:\/\/www.griddb.net\/ja\/","name":"GridDB: Open Source Time Series Database for IoT","description":"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL","publisher":{"@id":"https:\/\/www.griddb.net\/ja\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.griddb.net\/ja\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.griddb.net\/ja\/#organization","name":"Fixstars","url":"https:\/\/www.griddb.net\/ja\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.griddb.net\/ja\/#\/schema\/logo\/image\/","url":"https:\/\/griddb-linux-griddb-linux-clone-gnbah8a6f2fwd5eb.westus-01.azurewebsites.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","contentUrl":"https:\/\/griddb-linux-griddb-linux-clone-gnbah8a6f2fwd5eb.westus-01.azurewebsites.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","width":200,"height":83,"caption":"Fixstars"},"image":{"@id":"https:\/\/www.griddb.net\/ja\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/griddbcommunity\/","https:\/\/x.com\/GridDBCommunity","https:\/\/www.linkedin.com\/company\/griddb-by-toshiba"]},{"@type":"Person","@id":"https:\/\/www.griddb.net\/ja\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233","name":"griddb-admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.griddb.net\/ja\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g","caption":"griddb-admin"},"url":"https:\/\/www.griddb.net\/en\/author\/griddb-admin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts\/55550","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/comments?post=55550"}],"version-history":[{"count":3,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts\/55550\/revisions"}],"predecessor-version":[{"id":55560,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts\/55550\/revisions\/55560"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/media\/55558"}],"wp:attachment":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/media?parent=55550"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/categories?post=55550"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/tags?post=55550"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}