Skip to main content
Glama
delete_ghost_page.py5.95 kB
import json import requests import os import base64 import hashlib import hmac import time from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry def delete_ghost_page(page_id: str) -> str: """ Deletes a page from Ghost blog. This function supports two usage scenarios: 1) Deleting a page 2) Retrieving the tool's metadata by passing page_id="__tool_info__" Args: page_id (str): The ID of the page to delete Returns: str: JSON-formatted string containing the response """ if page_id == "__tool_info__": info = { "name": "delete_ghost_page", "description": "Deletes a page from Ghost blog", "args": { "page_id": { "type": "string", "description": "The ID of the page to delete", "required": True } } } return json.dumps(info) if not page_id: return json.dumps({"error": "Page ID is required"}) api_url = os.environ.get("GHOST_API_URL", "http://192.168.50.80:8083").rstrip("/") admin_id = "67b2d2824fdabf0001eb99ea" admin_secret = "100eda163e9fea6906fbd7ddc841812c70561b19ab2e6d7b31f844f6ccd7b05d" try: # Create JWT token manually header = { "alg": "HS256", "typ": "JWT", "kid": admin_id } iat = int(time.time()) payload = { "iat": iat, "exp": iat + 300, # Token expires in 5 minutes "aud": "/admin/" } # Base64 encode header and payload header_encoded = base64.urlsafe_b64encode(json.dumps(header).encode()).rstrip(b'=').decode('utf-8') payload_encoded = base64.urlsafe_b64encode(json.dumps(payload).encode()).rstrip(b'=').decode('utf-8') # Create signature message = f"{header_encoded}.{payload_encoded}" key = bytes.fromhex(admin_secret) signature = hmac.new(key, message.encode(), hashlib.sha256).digest() signature_encoded = base64.urlsafe_b64encode(signature).rstrip(b'=').decode('utf-8') # Combine into final token token = f"{header_encoded}.{payload_encoded}.{signature_encoded}" session = requests.Session() adapter = HTTPAdapter(max_retries=Retry( total=3, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504] )) session.mount("http://", adapter) session.mount("https://", adapter) headers = { "Authorization": f"Ghost {token}", "Accept": "application/json", "Content-Type": "application/json" } # Ghost Admin API endpoint url = f"{api_url}/ghost/api/admin/pages/{page_id}" print(f"Making request to: {url}") print(f"Headers: {headers}") response = session.delete( url, headers=headers, timeout=30 ) response.raise_for_status() # Ghost returns 204 No Content for successful deletion if response.status_code == 204: return json.dumps({"success": True, "message": f"Page {page_id} deleted successfully"}) return json.dumps(response.json()) except requests.exceptions.RequestException as e: error_msg = str(e) if hasattr(e, 'response') and e.response is not None: error_msg += f"\nResponse: {e.response.text}" return json.dumps({"error": f"Network or HTTP error - {error_msg}"}) except Exception as e: return json.dumps({"error": f"Unexpected error - {str(e)}"}) finally: session.close() if __name__ == "__main__": print("Testing delete_ghost_page tool...") # Example page deletion print("\nDeleting page...") try: # Get the About page api_url = os.environ.get("GHOST_API_URL", "http://192.168.50.80:8083").rstrip("/") list_url = f"{api_url}/ghost/api/admin/pages/" # Create JWT for listing request iat = int(time.time()) header = {"alg": "HS256", "typ": "JWT", "kid": "67b2d2824fdabf0001eb99ea"} payload = {"iat": iat, "exp": iat + 300, "aud": "/admin/"} header_encoded = base64.urlsafe_b64encode(json.dumps(header).encode()).rstrip(b'=').decode('utf-8') payload_encoded = base64.urlsafe_b64encode(json.dumps(payload).encode()).rstrip(b'=').decode('utf-8') message = f"{header_encoded}.{payload_encoded}" key = bytes.fromhex("100eda163e9fea6906fbd7ddc841812c70561b19ab2e6d7b31f844f6ccd7b05d") signature = hmac.new(key, message.encode(), hashlib.sha256).digest() signature_encoded = base64.urlsafe_b64encode(signature).rstrip(b'=').decode('utf-8') list_token = f"{header_encoded}.{payload_encoded}.{signature_encoded}" list_headers = { "Authorization": f"Ghost {list_token}", "Accept": "application/json" } pages = requests.get( list_url, params={"filter": "slug:about"}, headers=list_headers ) print(f"List pages response status: {pages.status_code}") pages_json = pages.json() print(f"List pages response: {pages_json}") if pages_json and len(pages_json.get("pages", [])) > 0: page_id = pages_json["pages"][0]["id"] print(f"Deleting page with ID: {page_id}") result = delete_ghost_page(page_id) response = json.loads(result) if "error" in response: print(f"Error deleting page: {response['error']}") else: print("Page deleted successfully!") print(json.dumps(response, indent=2)) else: print("About page not found") except Exception as e: print(f"Error during test: {str(e)}")

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/oculairmedia/Ghost-MCP'

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