Bear MCP Server

by jkawamoto
Verified
# __init__.py # # Copyright (c) 2025 Junpei Kawamoto # # This software is released under the MIT License. # # http://opensource.org/licenses/mit-license.php import logging import socket import sys from typing import Final import rich_click as click from mcp_bear.server import create_server def is_port_in_use(port: int, host: str = "127.0.0.1") -> bool: """Check if a port is currently in use on the given host.""" with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: sock.settimeout(1) result = sock.connect_ex((host, port)) return result == 0 @click.command() @click.option("--token", envvar="BEAR_API_TOKEN", required=True, help="Bear API token") @click.option( "--callback-host", default="127.0.0.1", help="hostname or IP address of the callback server", show_default=True, ) @click.option( "--callback-port", default=11599, help="port number on which the callback server is listening", show_default=True, ) @click.version_option() def main(token: str, callback_host: str, callback_port: int) -> None: """A MCP server for interacting with Bear note-taking software.""" logging.basicConfig( level=logging.INFO, format="%(levelname)s: %(message)s", handlers=[ logging.StreamHandler(sys.stderr), ], ) logger = logging.getLogger(__name__) for port in range(callback_port, callback_port + 10): if is_port_in_use(port, callback_host): logger.info(f"Port {port} is already in use. Trying another port.") else: callback_port = port break else: logger.error("No available port found. Please try again.") sys.exit(1) mcp = create_server(token, callback_host, callback_port) logger.info("Starting MCP server (Press CTRL+D to quit)") mcp.run() logger.info("MCP server stopped") __all__: Final = ["main"]